比较c / c ++中的float和integer

时间:2014-11-22 09:48:34

标签: c++ c floating-point floating-accuracy floating-point-precision

出于安全原因,我需要执行两次相同的计算,一次只使用整数(int32)变量,另一次只使用float(float32)变量。在计算结束时,两个结果之间正在进行比较。

我阅读了有关comparing floating point numbers的文章。

我不理解的事情很少:

  1. 我没有针对浮点数进行以下压缩:假设 a b 是浮点数,这种比较方式是否正确:

    if!(a> b)&& !(a< b)为真,那么 a b 可能是相同的,否则不会。

  2. 如果我将一个浮点数转换为整数,我得到数字的整数部分,为什么通过使用union对象并定义与 int32 float32相同的内存我得到不同的解决方案?它是否也将浮点数转换为 int32

3 个答案:

答案 0 :(得分:3)

为什么通过使用union对象并且定义与int32和float32相同的内存我会得到不同的解决方案?

float/int union甚至有意义的唯一原因是floatint共享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。这两个值与表示相同的数字有关。您可以将它们占用的内存看作floatinteger,因为它们都占用了32-bits内存。如果您浏览float窗口,就会看到32-bits表示float的含义。另一方面,如果你看32-bitsinteger相同,那么如果将32-bits视为integer,则不会再看到float。查看二进制表示的示例通常会有所帮助。

例如,123.45632-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-bitexpbiased exponent23-bits,剩下的mantissa称为float 123.456。你无法做到可以期望投出integer 123并获得接近7 orders of magnitude的任何内容,大约{{1}}

它是否也将浮动数转换为int32?

答案:

答案 1 :(得分:2)

  1. 假。例如,ab都是nan,在这种情况下,a < ba > ba == b都是假的。
  2. 因为整数和浮点数的表示方式不同。当您将float投射到int(例如,1.0f1)时,他们的记忆力会不一样。

答案 2 :(得分:2)

  1. 假。在浮点类型中,除了像nan和inf这样的特殊数字之外,比较与整数相同。如果a的值恰好等于b,a == b总是返回true,即12.345 == 12.34512.345 < 12.346。如果您需要比较该值彼此足够接近,请使用像FatihK这样的epsilon

  2. (int)some_double_value这样简单的转换为int只会返回some_double_value的。但是,如果将它存储到一个联合中并读出这样的整数,它将在浮动内存中返回表示

  3. 例如(int)2.5 == 2但IEEE-754 double precision中2.5的二进制表示形式为0x4004000000000000