2

好的,所以我知道您通常不应该比较两个浮点数是否相等。然而,在威廉·卡汉 (William Kahan) 的《浮点计算中对舍入的无意识评估有多无用?他显示了以下代码(我相信是伪代码):

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 转换为双精度以保持多类型表达式中涉及的值的精度?

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

4

2 回答 2

3

是的,是的。

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

当然,最好的方法是使用浮点文字:1.0或者只是1.具有 type double1.0fis a float,并且my_float_type(1)具有它应该具有的任何类型 :v) 。

于 2010-09-25T07:32:16.947 回答
1

整数被转换为双精度。

请参阅第 5 节C++ 标准中的表达式的开头。

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

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

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

于 2010-09-25T08:07:05.003 回答