![]() |
1
12
IEE754中的双精度数精度为52位,这意味着它们可以精确存储最多(至少)2个数字。 五十一 . 如果您的long是32位的,那么它们的(正值)范围只有0到2。 三十一 所以没有32位的长度不能精确地表示为双精度数。对于64位的长度,大约是2 五十二 所以我会从那里开始,而不是从零开始。
您可以使用以下程序检测故障开始出现的位置。在早期的版本中,我依赖于这样一个事实:连续两倍的数字中的最后一个数字跟在序列2,4,8,6之后。然而,我最终选择使用一个已知的可信工具
记住这个
可以
受…的影响
这是程序:
这一直持续到:
这就是我期望它失败的地方。 顺便说一下,我最初用的是2号表格的数字 n 但这让我想到:
双字节大小为8字节
|
![]() |
2
2
第一个长到“错误”时,投射到double将不会在1e-8之前关闭,它将在1之前关闭。只要双精度数在其意义上能与长匹配,它就能准确地表示它。 我忘记了一个双精度和偏移的确切位数,但这会告诉你它能代表的最大大小。第一个long-to-wrong应该是二进制形式10000…,所以从1开始向左移动可以更快地找到它。 维基百科说有52位的意义,不包括隐含的起始值1。这意味着要转换为不同值的第一个long是2^53。 |
![]() |
3
1
尽管我在讨论中不愿提及Fortran 95及其继承者,但我会提到,自1990年以来,Fortran标准提供了一个间隔内在函数,它告诉您可表示实域与给定实域之间的区别。您可以对此进行二进制搜索,在间距(x)>增量时停止。对于使用与您感兴趣的浮点模型相同的编译器(可能是IEEE754标准),您应该得到相同的结果。 |
![]() |
4
0
另一方面,我认为double可以精确地表示所有整数(在其界限内)。 如果不是这样的话,那么你会想把I和D都投射到比它们中任何一个更精确的东西上。也许一个长的双人床就行了。 |
![]() |
Darky · 多重定义…c++vsCode[重复] 2 年前 |
![]() |
Ty Q. · 分段故障GLFW3/GLAD 3 年前 |
![]() |
Noè Murr · 如何获得C函数的基本编译二进制代码? 3 年前 |
![]() |
AvirukBasak · gcc中无return语句的尾部递归 3 年前 |
![]() |
hepl · gcc如何决定在创建可执行文件时使用dynamics库? 3 年前 |