当前位置: 首页 > 知识库问答 >
问题:

当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据?

隗嘉歆
2023-03-14

IEEE 754双精度浮点格式的二进制精度为53位,转换为log10(2^53)~ 16位有效十进制数字。

如果使用双精度格式将浮点数存储在内存中的64位长字中,52位为有效位,1位为隐藏位,但使用更高的精度将数字输出到屏幕,那么实际上从内存中读取哪些数据并将其写入输出?

当单词的总长度为64位时,机器上的从内存中读取操作是否只是简单地读取更多位并将它们解释为数字意义的加法?

例如,以数字0.1为例。无论使用何种精度,它都没有精确的二进制浮点表示,因为它在有效位中有一个无限重复的二进制浮点模式。

如果以双精度存储0.1,并以精度打印到屏幕上

#include <iostream> 
#include <iomanip> 

using namespace std;

int main()
{
    double x = 0.1; 
    cout << setprecision(50) << "x= " << x << endl;
}; 

输出(在我的机器上执行时)为:

x=0.100000000000000551151231257827021181583404541

如果正确的舍入与2个保护位和1个粘性位一起使用,我可以相信错误5.551115123125783e-17中前三个非零二进制浮点数给出的十进制值吗?

共有1个答案

栾峰
2023-03-14

每一个二进制分数都与某个十进制分数完全相等。通常情况下,如果双精度浮点是二进制浮点类型,则每个双精度数字都有一个完全相等的十进制表示。

接下来,我假设您的系统使用IEEE 754 64位二进制浮点来表示双精度。这不是标准的要求,但很常见。该格式中最接近0.1的数字的精确值为0.10000000000000055115123125782702118158340454015625

虽然这个数字有很多位数,但它正好等于3602879701896397/255。分子和分母都乘以555将其转换为十进制分数,同时增加分子中的位数。

与问题中的结果一致的一种常见方法是使用舍入到最接近格式所需的位数。这确实会提供有关将字符串转换为Double时舍入错误的有用信息。

 类似资料:
  • 问题内容: 如果我们运行以下代码: 它打印: 文字1.2345678990922222中的长尾将被忽略,但1.22222222222222222222中的长尾不会被忽略(变量d中的最后一个十进制数字变为3而不是2)。为什么? 问题答案: 打印a 或a 时看到的位数是Java的默认规则(从和转换为十进制)的结果。 Java的浮点数默认格式使用最少的有效十进制数字来将数字与附近的可表示数字区分开。1个

  • 问题内容: 我正在使用通过远程MySQL数据库存储其数据的C ++应用程序。 功能之一是尽可能保持远程数据的最新状态。为此,我使用NOW()函数获取上次更新时间,并且在更新记录时,将last_changed字段设置为NOW()。 现在可以正常工作,但问题是它的最大精度可达一秒。导致数十个重复条目,这浪费带宽,并且必须手动删除它们。 为了限制大部分膨胀,我希望有一个大于此精度的精度,最好是一个微秒(

  • 我们已经讨论过,在早期版本的Fortran中,有两种real类型:默认的真实类型和double precision类型。 但是,Fortran 90/95通过kind规范提供了对实数和整数数据类型精度的更多控制。 种类属性 不同种类的数字以不同方式存储在计算机内。 kind属性允许您指定内部存储数字的方式。 例如, real, kind = 2 :: a, b, c real, kind = 4

  • 程序是这样的。它的意思是根据工作时数、时薪、扣缴税款等来计算员工的净工资。它计算正确,但双点精度格式将最后一个小数四舍五入,失去了计算的准确性。 示例输入: } 请怜悯;我是一年级学生。

  • 问题内容: 文档的内容如下(强调我的意思)。 此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意时间以来的纳秒(也许是将来的时间,因此值可能为负)。 此方法提供纳秒精度,但不一定提供纳秒精度。 无法保证值更改的频率。 如我所见,这可以用两种不同的方式解释: 在句子中 大胆 上面是指个人的返回值。然后,将在数字意义上理解精度和准确性。也就是说,精度是指有效

  • 问题内容: 有没有一种方法可以用Python高精度地测量时间-比一秒更精确?我怀疑是否存在跨平台的方法;我对Unix上的高精度时间很感兴趣,尤其是在Sun SPARC计算机上运行的Solaris。 timeit似乎可以进行高精度的时间测量,但是我想直接访问时间值,而不是测量代码段要花多长时间。 问题答案: 标准功能提供亚秒级的精度,尽管该精度因平台而异。对于Linux和Mac,精度为1微秒或0.0