出于安全原因,我需要执行两次相同的计算,一次只使用整数(int32)变量,另一次只使用float(float32)变量。在计算结束时,两个结果之间正在进行比较。
我阅读了有关comparing floating point numbers的文章。
我不理解的事情很少:
我没有针对浮点数进行以下压缩:假设 a 和 b 是浮点数,这种比较方式是否正确:
if!(a> b)&& !(a< b)为真,那么 a 和 b 可能是相同的,否则不会。
如果我将一个浮点数转换为整数,我得到数字的整数部分,为什么通过使用union对象并定义与 int32 和 float32相同的内存我得到不同的解决方案?它是否也将浮点数转换为 int32 ?
答案 0 :(得分:3)
为什么通过使用union对象并且定义与int32和float32相同的内存我会得到不同的解决方案?
float/int union
甚至有意义的唯一原因是float
和int
共享storage size
32-bits
这一事实。您缺少的是理解floats
(实际上所有浮点数)都存储在IEEE-754 Floating Point Format
中(浮动单精度,双精度双精度精度等。)
当您使用float/int union
技巧时,您会看到integer value
integer equivalent
IEEE-754 Single-Precision Floating Point Format
float
。这两个值与表示相同的数字值的无有关。您可以将它们占用的内存看作float
或integer
,因为它们都占用了32-bits
内存。如果您浏览float
窗口,就会看到32-bits
表示float
的含义。另一方面,如果你看32-bits
与integer
相同,那么如果将32-bits
视为integer
,则不会再看到float
。查看二进制表示的示例通常会有所帮助。
例如,123.456
值32-bits
。如果您查看内存中的The float value entered : 123.456001
binary value in memory : 01000010-11110110-11101001-01111001
As unsigned integer : 1123477881
,您会看到:
0 1 0 0 0 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 1 0 0 1
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|
|s| exp | mantissa |
IEEE-754单精度浮点表示是内存中的特定浮点格式,由以下3个组件组成:
s
sign-bit
是exp
,biased exponent
是23-bits
,剩下的mantissa
称为float 123.456
。你无法做到可以期望投出integer 123
并获得接近7 orders of magnitude
的任何内容,大约{{1}}
它是否也将浮动数转换为int32?
答案:否
答案 1 :(得分:2)
a
和b
都是nan
,在这种情况下,a < b
,a > b
,a == b
都是假的。float
投射到int
(例如,1.0f
到1
)时,他们的记忆力会不一样。答案 2 :(得分:2)
假。在浮点类型中,除了像nan和inf这样的特殊数字之外,比较与整数相同。如果a的值恰好等于b,a == b
总是返回true,即12.345 == 12.345
但12.345 < 12.346
。如果您需要比较该值彼此足够接近,请使用像FatihK这样的epsilon
像(int)some_double_value
这样简单的转换为int只会返回some_double_value的值。但是,如果将它存储到一个联合中并读出这样的整数,它将在浮动内存中返回表示
例如(int)2.5 == 2但IEEE-754 double precision中2.5的二进制表示形式为0x4004000000000000