首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么是10000000000000000 = 10000000000000000?

为什么是10000000000000000 = 10000000000000000?
EN

Stack Overflow用户
提问于 2013-09-18 16:47:59
回答 4查看 529关注 0票数 0

首先,看看Visual中使用C++的以下代码:

代码语言:javascript
复制
float a = 10000000000000000.0;
float b = a - 10000000000000000.0;

打印出来时,结果是:

代码语言:javascript
复制
a = 10000000272564224.000000
b = 272564224.000000

当在“Debug下监视”中查看它们时,结果是:

代码语言:javascript
复制
-Name-   -Value-          -Type-
a        1.0000000e+016   float
b        2.7256422e+008   float

10000000000000000.0:我确信float的范围内.为什么我们不能使用获得正确的/ b

Followup-question:的预问题,基于所有伟大的以下答案.我知道原因是32位浮点数的精度约为7位,所以除了前6-7位数字外,所有的赌注都取消了。这就是为什么数学计算不出结果的原因,而且打印这些大数字看起来是错误的。我得用双倍才能更准确。那么,为什么声称能够处理大量的数字,同时又不能信任它呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-12-22 07:58:28

您所使用的庞大数字确实在浮动的“范围”之内,但并不是所有的数字都在浮点数的“精度”之内。32位浮点数的精度约为7位,所以除了前6-7位数字外,所有的赌注都取消了。这就是为什么数学不可行的原因,当你使用这些大的数字时,打印看起来是“错误的”。如果你想要更准确,使用双倍。有关更多信息,请参见computers

票数 2
EN

Stack Overflow用户

发布于 2013-12-22 07:59:04

浮点数大约需要6-7位小数位(小数为23位),所以任何小数位数较多的数字都只是一个近似。这就导致了这个数字。

有关浮点格式精度的更多信息:format

用于更新的问题:,当需要精度时,不应该使用浮点格式。我们不能只指定更大的内存空间。处理小数位数量很大的数字需要非常大的内存,.So使用了更复杂的方法(例如使用字符串格式,然后依次处理字符)。

为了避免这个问题,请使用double,它给出16到17位的小数位(分数是52位),或者使用long double来获得更高的精度。

代码语言:javascript
复制
#include <stdio.h>
int main()
{
double a = 10000000000000000.0;
double b = a - 10000000000000000.0;
printf("%f\n%f", a, b);
}

示例http://ideone.com/rJN1QI

票数 2
EN

Stack Overflow用户

发布于 2013-12-22 08:07:58

您的困惑是由隐式转换和缺乏float的准确性造成的。

让我为你填写隐含的转换:

代码语言:javascript
复制
float a = (float)10000000000000000.0;
float b = (float)((double)a - 10000000000000000.0);

这会将文字double转换为float,并且它能得到的最接近的值是10000000272564224。然后使用double而不是float执行减法,因此第二个10000000000000000.0不会丢失精度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18877902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档