在C中加上两个大双数会导致错误的结果

如何解决在C中加上两个大双数会导致错误的结果

我想问一个问题,就是要添加两个用C语言加倍的大数字。

让我们说有两个数字加倍:1.31E + 42和1.399E + 43。

如果我在Excel中进行添加,则结果为15300000000000000000000000000000000000000000000000。那应该是正确的。

如果我使用C语言进行加法,则结果为15299999999999999804804719125983728080953278464。

差异很大。在C语言中将双数相加或相乘时,有人知道如何获得正确的结果吗?

我必须添加另一个重要信息。一件事是将其打印出来。我知道可以按照你们的建议打印号码。但是我也需要它作为另一项工作的价值。具体而言,这是分析两个圆的任务-它们的相交和/或接触(如果它们在外部或内部相接触,或者存在相交)。 https://www.bbc.co.uk/bitesize/guides/z9pssbk/revision/4 如果两个圆心之间的距离(V)等于其半径之和(外部接触)或半径之差(内部接触),则两个圆会接触。因此,我必须对外部触摸进行加法运算,然后比较它们的中心V之间的距离是否等于其半径之和。因此,这不仅仅是打印出价值。

第一个圈子:

Sx = -3.2E+41,Sy = -3.31E+42,R = 1.31E+42

第二圈:

Sx = 1.354E+43,Sy = 3.17E+42,R = 1.399E+43

两个C语言中心之间的距离是:

V = 15300000000000002280599204554488630751526912.000000

其半径之和为C语言:

SumR =15299999999999999804719125983728080953278464.000000

根据参考,它们应该在外部进行触摸,因此,如果执行以下条件,我将获得没有外部触摸的信息。

if (fabs(V - SumR) < 0.001)
  printf("There is an external touch")
else
  printf("No external touch")

解决方法

浮点运算近似于实数运算。在将十进制数转换为二进制浮点数或执行浮点算术时,通常不应期望使用实数算术得到的结果。

此答案假设您的C实现对double使用IEEE-754 binary64格式,并使用从最近到最近的关系到偶数执行算术,包括从十进制到double的转换。 / p>

binary64格式具有一个符号,一个53位有效数字(数字的“小数部分”)和一个11位指数。

此格式不能代表1.31•10 42 。它可以表示的最接近的值为1310000000000000060347708657386176332693504。当您的C源文本包含1.31e42时,编译器会将其转换为1310000000000000060347708657176176693693504。如果我们使用十六进制表示有效位数,则为1.E137CED6DF0D1 16 •2 139 。您可以看到开头的“ 1”和另外13个十六进制数字(每个4位)组成53位。

格式也不能代表1.399•10 43 。它可以表示的最接近值为13989999999999999899113922922237014438982975488。当C源文本包含1.399e43时,编译器会将其转换为13989999999999999899113922237014438982975488。使用十六进制,这是1.4131D470653E9 16 •2 143

添加这些后,通常的数学结果无法表示。产生的结果是最接近的可表示数字,它是152999999999999999999804719125983728080953278464。使用十六进制,它是1.5F45515DD32F6 16 •2 143

这是浮点算术所期望的正确结果。为您的目的获得“正确”结果取决于您要完成的工作。对于许多目的,使用浮点数获得近似结果就足够了,并且人们仅理解该结果是近似值。如果需要精确的结果,则必须使用其他格式和软件。

,

如果您需要处理大数,则应使用arbitrary precision arithmetic之类的GMPlib(又称大数字)库。

如果要使用浮点数,请花一些时间来阅读floating point guide和有关IEEE 754的知识。它们不遵循real numbers的直观属性(例如,大多数操作都不具有关联性)。

先阅读Modern Cthis C reference网站,然后阅读C11标准草案n1570

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res