浮点溢出为负数

Floating-point overflows to negative

提问人:Sorawee Porncharoenwase 提问时间:9/9/2017 更新时间:9/9/2017 访问量:1210

问:

我们知道,有符号整数可能会有整数溢出,例如,符号位从 0 翻转到 1,导致正整数变为负数。

浮点数也会发生同样的情况吗?从实验上讲,当数字太大时,它就会变成 .但是,难道不能溢出尾数或指数,导致类似的问题吗?Inf

浮点精度 数溢出

评论


答:

1赞 rcgldr 9/9/2017 #1

在IEEE型浮点数(浮点数32位,双64位,长双80位)的情况下,数字的存储类似于符号+幅度,而不是二进制补码。指数也没有正常范围,零位或所有一位都有特殊值。双精度的 Wiki 文章:

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

如果对不包含特殊值情况(如无穷大、NAN 等)的浮点类型数组执行基数排序之类的操作,则通常使用从符号和大小到“二的补码”的转换。示例 C 宏,用于在 64 位符号和幅度之间转换为无符号长整型(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))