c++ - double 在什么时候开始失去精度?

标签 c++ floating-point ieee-754

我的应用程序需要执行一些操作:> , < , == , != , + , - , ++等(但没有除法)在某些数字上。这些数字有时是整数,很少是 float 。

如果我在内部使用“double”类型(由 IEEE 754 定义),即使是整数,直到什么时候我才能安全地使用它们,就好像它们是 int s,不会出现奇怪的舍入错误(例如,n == 5 && n == 6 都是真的,因为它们舍入到相同的数字)?

显然,各种操作的第二个输入( +- 等)始终是一个整数,我知道 0.000[..]01从一开始我就会遇到麻烦。

作为奖励答案,同样的问题,但针对 float .

最佳答案

IEEE-754 中的位数双尾数为 52,还有一个额外的隐含位,它始终为 1。这意味着可以包含的最大值恰好是 2^53,即 9007199254740992。

浮点尾数是 23 位,同样带有隐含位。可以精确表示的最大整数是 2^24,即 16777216。

如果您只想保存整数值,通常有一个 64 位整数类型比 double 类型更合适。

编辑:最初我有 2^53-1 和 2^24-1,但我意识到没有必要减去 1 - 偶数可以利用尾数右侧隐含的 0 位。

关于c++ - double 在什么时候开始失去精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9264138/

相关文章:

C - 如何存储 IEEE 754 double 和单精度

c# - 两个应用程序之间的通信(一个在 Qtc++ 中,另一个在 C# 中)

swift - Swift 中的 Double vs Float80 速度

javascript - 是否可以返回 0 的小数点后两位的浮点值?

c++ - 是否有任何具有非 IEEE C/C++ 浮点格式的现代平台?

cuda - NVIDIA GPU (sm_13) 上的 IEEE-754 标准

c++ - 在文本文件中搜索短语 C++

c++ - 返回映射中符合条件的一组键

c++ - 在Visual C++项目中添加文件夹

linux - 是否可以在 ifort 中启用舍入为零或舍入为负无穷大?