为什么我需要17位有效数字而不是16位来表示双精度数?

如何解决为什么我需要17位有效数字而不是16位来表示双精度数?

| 有人可以给我举一个浮点数(双精度)的例子吗,它需要超过16个有效十进制数字来表示它? 我在此线程中发现有时您最多需要17位数字,但是我找不到这样一个数字的示例(对我来说16位似乎足够)。 有人可以澄清吗? 非常感谢!     

解决方法

我的另一个答案是完全错误的。
#include <stdio.h>

int
main(int argc,char *argv[])
{
    unsigned long long n = 1ULL << 53;
    unsigned long long a = 2*(n-1);
    unsigned long long b = 2*(n-2);
    printf(\"%llu\\n%llu\\n%d\\n\",a,b,(double)a == (double)b);
    return 0;
}
编译并运行以查看:
18014398509481982
18014398509481980
0
a和b只是2 *(2 ^ 53-1)和2 *(2 ^ 53-2)。 这些是17位以10为底的数字。四舍五入到16位数字时,它们是相同的。然而,a和b显然只需要53位精度即可表示为2。因此,如果您选择a和b并将其强制转换为两倍,则会得到反例。     ,我认为该线程上的那个人是错误的,并且16个基数10的数字始终足以表示IEEE双精度。 我尝试证明的过程如下: 假设否则。然后,必须使用相同的16位有效数字以10为基数来表示两个不同的双精度数字。 但是,两个不同的双精度数必须在2 ^ 53中至少相差一倍,大于10 ^ 16中的一倍。而且,在10 ^ 16中相差不超过一个部分的两个数字都不能四舍五入为相同的16位有效数字的10进制数。 这并不完全严格,可能是错误的。 :-)     ,正确的答案是上述Nemo提出的答案。在这里,我只是粘贴一个简单的Fortran程序,其中显示了两个数字的示例,需要打印17位数字的精度,这表明如果您不想丢失任何双精度数字,则确实需要
(es23.16)
格式才能打印双精度数字。精确:
program test
implicit none
integer,parameter :: dp = kind(0.d0)
real(dp) :: a,b
a = 1.8014398509481982e+16_dp
b = 1.8014398509481980e+16_dp
print *,\"First we show,that we have two different \'a\' and \'b\':\"
print *,\"a == b:\",a == b,\"a-b:\",a-b
print *,\"using (es22.15)\"
print \"(es22.15)\",a
print \"(es22.15)\",b
print *,\"using (es23.16)\"
print \"(es23.16)\",a
print \"(es23.16)\",b
end program
它打印:
First we show,that we have two different \'a\' and \'b\':
a == b: F a-b:   2.0000000000000000     
using (es22.15)
1.801439850948198E+16
1.801439850948198E+16
using (es23.16)
1.8014398509481982E+16
1.8014398509481980E+16
    ,深入研究单精度和双精度基础知识,并让自己摆脱这种(16-17)许多十进制数字的概念,并开始考虑(53)二进制数字。如果您花一些时间在这里,可以在stackoverflow上找到必要的示例。 我看不到如何在没有合格的BINARY解释的情况下,给任何给出十进制答案的人最好的答案。这些东西很简单,但并非无关紧要。     ,可以由双精度(8字节IEEE)精确表示的最大整数连续范围是-2 ^ 53至2 ^ 53(-9007199254740992。至9007199254740992。)。数字-2 ^ 53-1和2 ^ 53 + 1不能用双精度表示。 因此,小数点左边不超过16个有效十进制数字将恰好表示连续范围内的双精度数。     

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?