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

浮点戏剧性错误(小数部分完全丢失)

上官和韵
2023-03-14
quotient = 43156414f / 3;

我在这里得到了商==14385472(完全不是真实值:1438547333…)。它完全失去了所有的部分!

我知道浮点计算不准确(似乎不是全部,我应该知道),但是,正如我所说,错误可能出现在更远的有效数字上。但是这里的红利只有8位数。为什么会发生如此戏剧性的错误?

可选子问题:我应该记住哪些规则来预见未来的此类错误?

请注意:将divident的类型从float改为double可以解决这个问题。

共有2个答案

丁振海
2023-03-14

浮点数)使用23位作为尾数

https://en.wikipedia.org/wiki/Single-precision_floating-point_format

因此,float可以表示高达2**24-1==16777215的整数,接近14385471。我们的可能性是:

 01001011 01011011 10000001 00111111 correponds to 14385471f (let's add 1 bit)
 01001011 01011011 10000001 01000000 correponds to 14385472f

所以我们可以看到,我们只有14385471f14385472f可供选择;如果浮动,则不能放置14385471.33333 F。我们来看看

 float x = 14385471.3333333333f;

 byte[] data = BitConverter.GetBytes(x);

 Console.Write(" ", string.Join(" ", data
   .Reverse()
   .Select(b => Convert.ToString(b, 2).PadLeft(8, '0'))));

我们会

 01001011 01011011 10000001 00111111

它对应于14385471f。我们还有更多的问题

 quotient = 43156414f / 3;

现在,<代码>43156414f

 01001100 00100100 10100000 11110000 corresponds to 43156416 

所以的实际值是

 43156416 / 3 == 14385472      

最后,如果你想有14385471.33是不够的,试试

 // 14385471.333333334
 double quotient = 43156414d / 3;
步炯
2023-03-14

浮点数的精度为6-9位。您的值太大,无法无损失地放入浮点数。

double的精度约为15-17位。

如图所示,检查(int)43156414f(double)43156414f的值-它们都是43156416

 类似资料:
  • 问题内容: 我的表中有以下列表。 我怎样才能得到小数点后的位数。 重复?: 我已经检查了现有的帖子,但是没有正确的方法来处理 数字 。 结果 编辑 :花了一些宝贵的时间后,我发现了一些相对简单的脚本来处理此问题。 问题答案: 我找到了一些简单的脚本(相对于我而言)来处理此问题。 此处仅用于处理不带小数部分的浮点数。如果没有没有小数部分的值,那么这很简单 希望对您有帮助。完整脚本如下

  • 给定一个浮点数,我想把它分成几个部分,每个部分都有一个给定的位数。例如,给定3.1415926535并要求将其分成以10为基数的4位数部分,它将返回3.1415.926E-4 5.350E-8。实际上,我想把一个double(有52位精度)分成三部分,每个部分有18位精度,但是用一个base-10的例子来解释更容易。我不一定反对使用标准双精度IEEE浮点的内部表示的技巧,但我确实更喜欢纯粹停留在浮

  • 问题内容: 我不知道这是否是一个明显的错误,但是在运行Python脚本以更改模拟参数时,我意识到缺少和的结果。在调查中,我注意到以下Python代码: 生成的相同文件的增量= 0.28和0.29,与.57和.58相同,原因是python返回float(29)/ 100为。但这不是系统错误,从某种意义上说,它并不是每个整数都发生的。因此,我创建了以下Python脚本: 而且我看不到发生这种舍入错误的

  • 本文向大家介绍C++中double浮点数精度丢失的深入分析,包括了C++中double浮点数精度丢失的深入分析的使用技巧和注意事项,需要的朋友参考一下 看了一篇关于C/C++浮点数的博文,在Win32下,把int, 指针地址,long等4字节整数赋给一个double后,再用该double数赋给原始类型的数,得到的结果于最初的数值一致,即不存在任何精度丢失。例如下面的结果将总是true: 但是对于l

  • 在编程语言中,小数通常以浮点数的形式存储。浮点数和定点数是相对的:小数在存储过程中如果小数点发生移动,就称为浮点数;如果小数点不动,就称为定点数。 如果你对浮点数的底层存储格式不了解,请猛击:小数在内存中是如何存储的,揭秘诺贝尔奖级别的设计(长篇神文) Python 中的小数有两种书写形式: 1) 十进制形式 这种就是我们平时看到的小数形式,例如 34.6、346.0、0.346。 书写小数时必须

  • 问题内容: 我正在读取一个带有浮点数的文本文件,这些数字都带有1或2个小数点。我正在使用将线转换为浮点数,并在失败的情况下引发。我将所有花车存储在列表中。打印时,我想将其打印为2个小数位的浮点数。 假设我有一个文本文件,其编号为-3,65、9,17、1。我阅读了每个文件,然后将它们转换为float并将它们附加到列表中。现在在Python 2中,调用return 。但是在Python 3中,-3.6