C++和Octave的结果对于简单的算术来说是不同的
C++ and Octave results differ for simple arithmetic
我有一个C++代码和一个Octave,它们都计算相同的方程
在C++中
#include <math.h>
int main()
{
float x = 1.5f;
float y = pow(x, 6) * 235809835.41f - pow(x, 5) * 2110439254.2f + pow(x, 4) *7869448124.8f - pow(x, 3) * 15648965509.0f + pow(x, 2) * 17503313074.0f - (x)* 10440563329.0f + 2594694745.0f; // result y = 3584
return 0;
}
八倍频程
x = 1.5
y = (x ^ 6) * 235809835.41 - (x ^ 5) * 2110439254.2 + (x ^ 4) *7869448124.8 - (x ^ 3) * 15648965509 + (x ^ 2) * 17503313074 - (x)* 10440563329 + 2594694745 // result y = 26
这两种情况下y的计算值不同。C++计算y为3584,而Octave计算y为26。造成这种分歧的原因是什么?
编辑:Excel生成与Octave相同的结果,并且该结果在公式的上下文中也是合乎逻辑的。所以,C++代码或编译器出了问题。
这似乎是由于float
类型的精度有限,这可能会导致其中一个操作被有效丢弃,因为一个操作数的大小小于另一个,从而导致结果发生重大更改。(看看这个极其做作的例子,它展示了这可能是什么样子。)
如果您重写代码以使用更精确的double
类型,则结果为26.810783,这与我在Maxima中评估公式时得到的结果相匹配。
进一步阅读:每一位计算机科学家都应该知道的关于浮点算术
相关文章:
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 将一个向量映射到不同的对,即使向量映射到每对时是不同的?
- int* 和 int** 是不同的类型吗?C++
- C++问题,我的两个源代码应该具有相同的输出,但它们是不同的
- 通过 char* 缓冲区读取 int 的行为是不同的,无论是正数还是负数
- OpenSSL:读取EC密钥,然后再次写入,这是不同的
- "const_iterator"真的需要与"迭代器"是不同的类吗?
- C++ 如果 Printf 位于函数中,则返回是不同的
- 在C 字符串中,为什么在最后一个字符之后,通过索引和()访问索引时行为是不同的
- 我正在比较两个具有相同值的变量,但它说它们是不同的
- 是一个被认为是不同类型的班级内部的正向声明
- 对于不同的消息,OpenSSL 签名长度是不同的
- 结果是不同的;C++ 中的 recv(sock,buf,sizeof(buf),0) 和 strlen(buf)
- 为什么推导出的乐趣(T t)和乐趣(T && t)的类型在C++中是不同的?
- 为什么C++编译器不优化对结构数据成员的读取和写入,而不是不同的局部变量?
- 使用模板在核心类型不同的不同项目中使用通用代码,这些项目的核心类型在 c++ 中是不同的
- python 和 c++ 的结果对于嵌套的 for 语句是不同的
- PCL中的这些增强指针初始化是不同的
- 一次又一次的恐惧。这是不同的
- 在C 中按行读取文本文件,每行都是不同的数据类型