可能重复:
Which is the first integer that an IEEE 754 float is incapable of representing exactly?
这是基本问题,我的感觉是答案是肯定的(int = 32位,double = 53位mantisa +符号位)。
基本上可以断言?
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不相同不会工作,但我想知道转换和adition / substraction(如果没有)溢出发生)保持等价。
答案 0 :(得分:4)
如果尾数中的位数> = =整数中的位数,则答案为是。在您的问题中,您为int
提供了特定的已知大小和double
的尾数,但有必要知道2003 C ++标准保证不,没有关于int
和double
的尾数的相对大小。
请注意,C和C ++不需要使用IEEE 754浮点运算。根据2003 C ++标准的3.8.1 / 8,
浮点类型的值表示是实现定义的。
实际上C ++允许浮点表示甚至不使用二进制尾数。对于C,#include< limits.h>可用于推断有关基本类型的信息。特别是,如果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标准。
答案 1 :(得分:3)
是。所有 N 位整数都可以用浮点表示来表示,该表示至少具有 N-1 尾数位(因为隐含的前导1位不需要是存储的)和一个至少可以存储 N 的指数,即 log(N)+1 位。
因此,您可以将int32_t
存储在具有31位尾数,5位指数和一个符号位的浮点值中,该位符合典型double
但不是{{1 }}。相反,只有24位尾数的float
只能准确存储最多25位的float
,即+/- 33,554,431。