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>::digits
和 numeric_limits<int>::max()
.
给定两个整数操作数和一个总是从整数操作数产生整数的运算(例如 +
或 *
,但不是 /
),所有 IEEE 754 舍入模式都将精确地产生整数。如果这个整数可以用 int
表示(因此可以在 double
中精确表示,假设我们假设它的尾数至少与 int
一样宽),那么它将与使用相应整数运算得到的整数相同。任何合理的 FP 实现都将保留上述保证,即使它不符合 IEEE 754 标准。
关于double - 所有 32 位整数都可以精确地表示为 double 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13269523/