从double转换为无符号int时得到错误结果
Getting wrong result when casting from double to unsigned int
之间有什么区别
unsigned int n = (n2-n1)/n3 + 1;
和
double N = (n2-n1)/n3 + 1;
unsigned int n = (unsigned int)(N);
其中n1
、n2
和n3
是double
s?我之所以这么问,是因为对于n1=3
、n2=4
和n3=0.1
,n
在第一种情况下得到10,在第二种情况下(至少在我的电脑上)得到11。正确答案是11,所以第一个的结果是错误的。我猜这与unsigned int
的截断有关。是这样吗?在转换为unsigned int
之前,第一种情况下的右侧表达式是否首先不计算为double
(在这种情况下,它将等效于第二段代码)?还有,有没有办法让较短的表达式(第一个)发挥作用?
第一种情况下的右侧表达式在转换为
unsigned int
之前,是否首先未计算为double
。
不一定。它可能被计算为long double
,这可能导致与double
不同的截断。不同的编译器或不同的编译器选项可能会产生不同的结果。
有没有办法让较短的表达式(第一个)发挥作用?
舍入通常是比截断好得多的策略,尤其是当您期望结果非常接近整数时。
标准参考:
&教派;6.3.1.8(常用算术转换),第2段,带相关脚注:
浮动操作数的值和浮动表达式的结果的值可以以比该类型所需的值更大的范围和精度来表示;因此不改变类型。(63)
63)仍然需要强制转换和赋值运算符来消除额外的范围和精度。
相关文章:
- 如何修复循环中的错误产生的错误结果?
- 添加可变参数函数的错误结果
- 使用特征 3 线性系统求解器的错误结果
- 按位包含 OR 的错误结果
- 如果我将索引变量更改为零,并且合并函数中的k = 0,则获得合并排序的错误结果
- STD :: FPCLASSIFY的错误结果使用Valgrind进行长时间的双重双重结果
- 视觉工作室的错误结果
- 将C#struct传递给C 不受管理的DLL返回错误结果
- 最长的常见子字错误结果
- 华氏度到摄氏度的错误结果
- UE4中简单坐标变换的错误结果
- 记忆错误结果的说明[编译器行为]
- 如何解决错误PRJ0002:错误结果 -1073741515从"cl.exe"返回?
- 错误 PRJ0002:错误结果 -1073741515 从"C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.
- glGetUniformLocation OpenGL ES 2.0(在ipad 3 iOS 7.0.3上返回错误结果)
- 在模板函数中调用std::for_each时出现错误结果
- 使用copy和back_inserter将矢量附加到其自身时出现错误结果
- CUDA 线程在全局内存中的私有位置写入时出现错误结果
- 来自 c++ 代码的错误结果
- 使用浮点值和铸造的算术运算的错误结果 - 差异很大,我想这不是准确值的情况(429497)?