【问题标题】:Comparing a float and an int比较浮点数和整数
【发布时间】:2015-01-20 11:10:02
【问题描述】:

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

我读到了关于comparing floating point numbers的文章。

有几件事我不明白:

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

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

【问题讨论】:

  • “我没有对浮点数进行以下压缩”是什么意思?

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


【解决方案1】:
  1. 错误。比如ab都是nan,那么a &lt; ba &gt; ba == b都是假的。
  2. 因为整数和浮点数的表示方式不同。当您将 float 转换为 int(例如,1.0f 转换为 1)时,它们的内存是不一样的。

【讨论】:

    【解决方案2】:

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

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

    当您使用float/int union 技巧时,您会看到integer valueinteger equivalentIEEE-754 Single-Precision Floating Point Formatfloat。这两个值与表示相同的数字无关。您可以将它们占用的内存视为floatinteger,因为它们都占用32-bits 的内存。如果您查看float 窗口,您会看到32-bits 的含义是float。另一方面,如果您将相同的32-bits 视为integer,您将看到与32-bits 相同的integer 的内容。查看二进制表示的示例通常会有所帮助。

    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 吗?

    答案:

    【讨论】:

      【解决方案3】:
      1. 错误

        浮点类型的比较与普通类型的整数类型相同。如果 a 的值正好等于 b,a == b 总是返回 true,即 12.345 == 12.34512.345 &lt; 12.346。如果您需要比较该值是否足够接近,请使用 epsilon 代替 ==。但是对于像NaNInf 这样的特殊数字,情况就不同了。对于除!= 之外的所有运算符,与 NaN 的比较返回 false

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

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

        例如(int)2.5 == 2,但IEEE-754 double precision中2.5的二进制表示是0x4004000000000000

      【讨论】:

        猜你喜欢
        • 2011-04-19
        • 1970-01-01
        • 2016-05-24
        • 2016-02-08
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 2021-09-30
        • 1970-01-01
        相关资源
        最近更新 更多