从double转换为unsigned int

时间:2012-09-06 11:11:14

标签: c++ math floating-point

我遇到了将值从Double转换为int的问题。我尝试运行以下代码:

int main()
{
    double val_d= 6.25e-05;
    cout << (1/val_d) << endl;
    unsigned int val_ui = (unsigned int ) (1/val_d);
    cout << val_ui << endl;
}

从double转换为int可能会删除小数部分,但应保留整数部分 它是什么?

我得到的输出是: 16000 15999

那么为什么这里的o / p有所不同? 这只发生在fedora上。在Windows和Ubuntu上它工作正常。 (两个输出都是16000)

我调整了上面的代码,得到了以下结果:

int main()
{
  double val_d= 6.25e-05;
  cout << (1/val_d) << endl;
  double val_intermediate =  (1/val_d) ;
  cout << val_intermediate << endl;
  unsigned int val_ui = (unsigned int ) val_intermediate;
  cout << val_ui << endl;

}

新产品是 16000 16000 16000

3 个答案:

答案 0 :(得分:15)

当源文本“6.25e-05”被解释为十进制数字并转换为double时,它不能完全表示,因为浮点值的精度有限,并且每个位的值都是二,不是十进制数字。最接近6.25e-5的IEEE 754双精度值为6.25000000000000013010426069826053208089433610439300537109375e-05,或者以十六进制浮点数0x1.0624dd2f1a9fcp-14。

当采用它的倒数时,确切的数学结果再次不能完全表示,因此必须再次舍入。最接近的双精度值是16000或0x1.f4p + 13.

C ++标准允许实现评估浮点表达式,其精度高于标称类型所需的精度。某些实现使用扩展精度,特别是Intel的80位浮点类型,它具有64位有效数字。 (常规双精度具有53位有效数。)在此扩展精度中,倒数为0xf.9fffffffffffe89p + 10或15999.99999999999966693309261245303787291049957275390625。

显然,当扩展精度结果被截断为整数时,结果为15999。

将long-double结果舍入为double将产生16000.(您可以使用显式强制转换为double来执行此操作;您不需要将中间值分配给double对象。)

答案 1 :(得分:6)

舍入的区别。

  1. (1 / val_d) - double将四舍五入到最接近的可能数字 可以用双精度表示; (例如:3.6999999999999999 == 3.7)
  2. (unsigned int)(1 / val_d) - 当转换为int小数部分时 截断,导致四舍五入(例如:int(3.6)== 3

答案 2 :(得分:1)

将浮点值转换为整数值会删除小数部分,前提是结果可以用整数类型表示(即值不能太大而不适合)。插入流舍入该值,这会产生不同的结果。