比较浮点数和整数

Comparing a float and an int

本文关键字:整数 浮点数 比较      更新时间:2023-10-16

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

我读了关于比较浮点数的文章。

有几件事我不明白:

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

    if !(a > b) && !(a < b) is true, then _a_ and _b_ are probably identical otherwise not.
    
  2. 如果我将浮点数转换为整数,我会得到数字的整数部分,为什么通过使用联合对象并在那里定义与 int32 和 float32 相同的内存,我会得到不同的解决方案?它不是也向 int32 投射浮点数吗?

为什么通过使用联合对象并在那里定义与 int32 和 float32 相同的内存,我得到了不同的解决方案?

float/int union甚至有意义的唯一原因是因为floatint共享32-bits storage size。你缺少的是理解floats(实际上是所有浮点数)都存储在IEEE-754 Floating Point Format中(浮点数是单精度的,双精度是双精度的,等等)。

当您使用float/int union技巧时,您会看到integer value,即float IEEE-754 Single-Precision Floating Point Formatinteger equivalent。这两个值与表示相同的数值无关。你可以把他们占据的记忆看作是一个float,或者一个integer,因为他们都占据了32-bits的记忆。如果您通过float窗口查看,您会发现这些32-bits作为float的含义。另一方面,如果您将相同的32-bits视为integer,则您看不到如果将其视为integer的相同32-bits。查看二进制表示的示例通常会有所帮助。

例如,float123.456 。如果您查看内存中的32-bits,您会看到:

The float value entered : 123.456001
binary value in memory  : 01000010-11110110-11101001-01111001
As unsigned integer     : 1123477881

IEEE-754 单精度浮点表示是内存中的一种特定浮点格式,由以下 3 个组件组成:

 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                   |

其中ssign-bitexpbiased exponent,其余的23-bits称为mantissa。你不可能期望投下float 123.456并获得任何接近integer 123的东西,你差了大约7 orders of magnitude

它不是也向 int32 投射浮点数吗?

答:

  1. 假。例如,ab都是nan,在这种情况下a < ba > ba == b都是假的。
  2. 因为整数和浮点数的表示方式不同。当你将float投射到int(例如,1.0f投射到1)时,它们的记忆是不一样的。
  1. 浮点类型的比较与普通类型的整数类型中的比较相同。 如果 a 的值正好等于 b,a == b总是返回 true,即 12.345 == 12.34512.345 < 12.346。如果需要比较该值是否彼此足够接近,请使用类似 epsilon 而不是 == 。但是,对于像NaN或Inf这样的特殊数字,情况就不同了。与 NaN 的比较对所有运算符返回 false !=

  2. 因为一个处理值,另一个处理对象表示

    (int)some_double_value 这样的简单强制转换为 int 将返回 some_double_value 的值。但是,如果您将其存储到联合中并像这样读出整数,它将返回浮点数内存中的表示

    形式

    例如(int)2.5 == 2但 IEEE-754 双精度中 2.5 的二进制表示形式0x4004000000000000