gpt4 book ai didi

c++ - 从 double 到 unsigned int 的转换

转载 作者:可可西里 更新时间:2023-11-01 17:05:44 25 4
gpt4 key购买 nike

我遇到了将值从 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 的转换可能会删除小数部分,但应保留整数部分是吗?

我得到的输出是:1600015999

那么为什么这里的 o/p 不同呢?这只发生在软呢帽上。在 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;

}

新输出是160001600016000

最佳答案

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

当取其倒数时,精确的数学结果又不能精确表示,因此必须再次四舍五入。最近的 double 值为 16000 或 0x1.f4p+13。

C++ 标准允许实现以比标称类型要求更精确的方式计算浮点表达式。一些实现使用扩展精度,特别是 Intel 的 80 位浮点类型,它有一个 64 位尾数。 (常规 double 具有 53 位有效数。)在此扩展精度中,倒数为 0xf.9fffffffffffe89p+10 或 15999.99999999999966693309261245303787291049957275390625。

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

将 long-double 结果四舍五入为 double 将产生 16000。(您可以通过显式强制转换为 double 来完成此操作;您不需要将中间值分配给 double 对象。)

关于c++ - 从 double 到 unsigned int 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12298783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com