【发布时间】:2013-01-05 23:30:25
【问题描述】:
我有一个内联函数进行频率到周期的转换。计算精度必须使用 long 类型,而不是 double 类型。否则,可能会导致一些舍入错误。然后该函数将结果转换回 double。我想知道在下面的代码中,哪一行会将计算保持在 long 类型中。无论参数栏是 100、100.0 还是 33.3333。
double foo(long bar)
{
return 1000000/bar;
return 1000000.0/bar;
return (long)1000000/bar;
return (long)1000000.0/bar;
}
我自己试过了,第 4 行有效。但只是想知道这种情况下类型转换的概念。
编辑:
其中一个错误是 1000000/37038 = 26,而不是 26.9993。
【问题讨论】:
-
请注意,存储在 double 中的整数值不会出现舍入错误,除非它超出尾数的范围,通常为 2**52。
-
bar 在作为 long 传递时不能为 33.3333。它将转换为 33。
-
bar 不可能是
100.0或33.3333。您应该使用 1000000L 作为常数。 -
PS:您能否详细说明您期望的舍入误差?要提供建议,您必须说明传递给函数的值范围以及您愿意接受的舍入误差。根据实际系统,可以选择使用 long double 类型或编译器支持的其他扩展精度类型 (en.wikipedia.org/wiki/Long_double)。但是请注意,MS VC++ long double 中的 AFAIK 只是同义词 4 double,在这方面无济于事。
-
@Stan:如果您进行整数运算(这就是您所说的,“必须使用类型
long”),那么您将得到整数结果:26,而不是 26.9993。如果您想要非整数结果,那么您需要使用浮点(或有理数,或其他)算术,而不是整数;例如,return 1000000/double(bar);