浮点数溢出为负数
Floating-point overflows to negative
我们知道有符号整数可能会发生整数溢出,例如,符号位从 0 翻转为 1,导致正整数变为负整数。
浮点数会发生同样的情况吗?实验上,当数字太大时,它就变成了Inf
。但是会不会尾数或者指数溢出,导致类似的问题?
对于 IEEE 类型的浮点数(浮点数 32 位、双精度 64 位、长双精度 80 位),数字的存储方式类似于符号 + 大小而不是二进制补码。指数也没有正常范围,具有零或全一的特殊值。双维基文章:
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
如果对不包括特殊值情况(如无穷大、NAN 等)的浮点类型数组进行基数排序之类的操作,则从符号和大小到 "two's complement" 的转换是通常使用。示例 C 宏,用于在 64 位符号和大小之间转换为 unsigned long long(64 位无符号整数)并返回。请注意,这会导致负零的转换符号和幅度值小于正零的符号和幅度值。
// converting doubles to unsigned long long for radix sort or something similar
// note -0 converted to 0x7fffffffffffffff, +0 converted to 0x8000000000000000
// -0 is unlikely to be produced by a float operation
#define SM2ULL(x) ((x)^(((~(x) >> 63)-1) | 0x8000000000000000ull))
#define ULL2SM(x) ((x)^((( (x) >> 63)-1) | 0x8000000000000000ull))
我们知道有符号整数可能会发生整数溢出,例如,符号位从 0 翻转为 1,导致正整数变为负整数。
浮点数会发生同样的情况吗?实验上,当数字太大时,它就变成了Inf
。但是会不会尾数或者指数溢出,导致类似的问题?
对于 IEEE 类型的浮点数(浮点数 32 位、双精度 64 位、长双精度 80 位),数字的存储方式类似于符号 + 大小而不是二进制补码。指数也没有正常范围,具有零或全一的特殊值。双维基文章:
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
如果对不包括特殊值情况(如无穷大、NAN 等)的浮点类型数组进行基数排序之类的操作,则从符号和大小到 "two's complement" 的转换是通常使用。示例 C 宏,用于在 64 位符号和大小之间转换为 unsigned long long(64 位无符号整数)并返回。请注意,这会导致负零的转换符号和幅度值小于正零的符号和幅度值。
// converting doubles to unsigned long long for radix sort or something similar
// note -0 converted to 0x7fffffffffffffff, +0 converted to 0x8000000000000000
// -0 is unlikely to be produced by a float operation
#define SM2ULL(x) ((x)^(((~(x) >> 63)-1) | 0x8000000000000000ull))
#define ULL2SM(x) ((x)^((( (x) >> 63)-1) | 0x8000000000000000ull))