c++数学表达式的错误结果
C++ wrong result of mathematical expression
我必须计算一些简单的数学表达式,但是当我在一行中执行时,结果总是为零。但正确的结果显然不是零。这很有趣,但是当我把表达式的各个部分分开时,我就得到了正确的答案。稍后我将与这个结果相除,因此它不应该是0。
表达式是这样的:
(X-X1)/(X2-X1)
在这种情况下: 0
double delta = (x - x1) / (x2 - x1);
但是这样 δ 将是正确的:
double top = x - x1;
double bottom = x2 - x1;
double delta = top/bottom;
你知道这是怎么发生的吗?
这是一个典型的"用整数除法得到浮点值"的例子。如果x
、x1
和x2
均为整数,则编译器应根据C和c++的规则,用整数计算方法计算x-x1
和x2-x1
,然后将它们的差除为整数除法。如果x2-x1
大于x-x1
,则结果为零[假设为7/14这样的正值。-14/-7显然是2]
double delta = static_cast<double>(x - x1) / (x2 - x1);
在第一种情况下,integer/integer,结果仍然是整型,然后将整型转换为double
在第二种情况下,double/double,那么你得到正确的结果
在第一种情况下,您正在执行int / int
,这将产生int
值。因此,如果分母大于分子,结果将被截断为0。
在第二种情况下,您正在计算double/double
表达式,该表达式将计算为double
值,因此保留小数和整数部分。
必须将整型除法转换为双精度。型铸造
相关文章:
- 如何修复循环中的错误产生的错误结果?
- 添加可变参数函数的错误结果
- 使用特征 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)?