double - 所有 32 位整数都可以精确地表示为 double 吗?

标签 double ieee-754

Possible Duplicate:
Which is the first integer that an IEEE 754 float is incapable of representing exactly?

这是基本问题,我的感觉是答案是肯定的(int = 32 bits,double = 53 bit mantisa + sign bit)。

基本上可以断言火?

int x = get_random_int();
double dx = x;
int x1 = (int) dx;
assert(x1 ==x);
if  (INT_MAX-10>x)
 {
       dx+=10;
       int x2=(int) dx;
       assert(x+10 == x2);
 }

显然,涉及具有除法和类似东西的复杂表达式的东西( (int)(5.0/3*3) 与 5/3*3 不同)不起作用,但我想知道转换和加法/减法(如果没有发生溢出)保持等价。

最佳答案

如果尾数位数 >= 整数位数,则答案是肯定的。在您的问题中,您给出了 int 的具体已知尺寸。和 double 的尾数,但知道这由 2003 C++ 标准保证是有用的,它没有说明 int 的相对大小和 double的尾数。

请注意,C 和 C++ 不需要使用 IEEE 754 浮点运算。根据2003 C++标准的3.8.1/8,

The value representation of floating-point types is implementation-defined.

事实上,C++ 允许甚至不使用二进制尾数的浮点表示。对于 C,#include 可用于推断有关基本类型的信息。特别是,如果 FLT_RADIX提升权力DBL_MANT_DIG大于或等于 INT_MAX ,然后全部 int值可以精确表示。在 C++ 中,相关数量被命名为 numeric_limits<double>::radix , numeric_limits<double>::digitsnumeric_limits<int>::max() .

给定两个整数操作数和一个总是从整数操作数产生整数的运算(例如 +* ,但不是 / ),所有 IEEE 754 舍入模式都将精确地产生整数。如果这个整数可以用 int 表示(因此可以在 double 中精确表示,假设我们假设它的尾数至少与 int 一样宽),那么它将与使用相应整数运算得到的整数相同。任何合理的 FP 实现都将保留上述保证,即使它不符合 IEEE 754 标准。

关于double - 所有 32 位整数都可以精确地表示为 double 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13269523/

相关文章:

C:使用 read 系统调用从 stdin 读取 double

floating-point - IEEE 754 浮点表示加法和超过 16 位格式的位置

algorithm - 如何找到为每个 double 值产生较小输出的乘数?

floating-point - 两个不相等的 float 相减是否可以得到0?

swift - Swift 中所有数字都遵循哪些协议(protocol)?

ios - 使用 Swift 的双重格式

java - 双重计算产生奇怪的结果

C++ 十进制数据类型

在 C 中将 float 转换为 IEEE 格式

c - 为什么转换 (unsigned long long)DBL_MAX(或 FLT_MAX)也会导致 FE_INEXACT 升高?