【问题标题】:What gets converted to what when comparing a double to an integer for identity?将 double 与整数进行身份比较时,什么会转换为什么?
【发布时间】:2011-04-17 02:43:48
【问题描述】:

好的,所以我知道您通常不应该比较两个浮点数是否相等。但是,在 William Kahan 的 How Futile are Mindless Assessments of Roundoff in Floating-Point Computation? 中,他显示了以下代码(我相信是伪代码):

Real Function T(Real z) :
      T := exp(z) ;                       ... rounded, of course.
      If (T = 1) Return( T ) ;            ... when |z| is very tiny.
      If (T = 0) Return( T := –1/z ) ;    ... when exp(z) underflows.
      Return( T := ( T – 1 )/log(T) ) ;   ... in all other cases.
      End T .

现在,我有兴趣在 C 或 C++ 中实现它,我有两个相关的问题:

a) 如果我将 T 设为双精度,那么在比较中 (T == 1) 或 (T == 0) 将 0 和 1 转换为双精度,以保持多参数中涉及的值的精度-type 表达式?

b) 这仍然算作比较两个浮点数是否相等吗?

【问题讨论】:

    标签: c++ c numerical


    【解决方案1】:

    是的,是的。

    对于 32 位整数,double 可以精确地表示每个值。但是,当您将 double 与 64 位 int 进行比较时,如果 int 大于 2^52,则可能会出现舍入错误。不过,您可以使用long double,它至少有 64 位尾数。

    当然,最好的方法是使用浮点字面量:1.0 或只是 1. 的类型为 double1.0ffloat,而 my_float_type(1) 具有任何类型应该:v)。

    【讨论】:

      【解决方案2】:

      整数被转换为双精度数。

      参见C++ standard 中第 5 节开头的表达式。

      如果您知道浮点数包含精确值,那么您无需担心不精确的表示。

      无符号整数可以完全表示为浮点数,只要它们适合尾数 + 1 位,对于有符号整数,它是尾数 + 2 位(除了最负整数,2-31 sup> 用于 32 位整数)。

      分母中2次方的分数也可以精确表示。

      【讨论】:

        猜你喜欢
        • 2021-08-07
        • 2014-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多