相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

0.1 + 0.2 == 0.3  ->  false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2         ->  0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

为什么浮点数不准确?

为什么有些数字在存储为浮点数时会失去准确性?

例如,十进制数9.2可以精确地表示为两个十进制整数(92/10)的比率,两者都可以用二进制(0b1011100/0b1010)精确表示.但是,存储为浮点数的相同比率永远不会完全等于9.2:

32-bit "single precision" float: 9.19999980926513671875
64-bit "double precision" float: 9.199999999999999289457264239899814128875732421875
Run Code Online (Sandbox Code Playgroud)

这样一个看似简单的数字如何在64位内存中表达"太大" ?

language-agnostic floating-point precision

181
推荐指数
4
解决办法
3万
查看次数

为什么我为std :: exp获得特定于平台的结果?

我有一个程序在Android和Windows下给出了截然不同的结果.当我根据二进制文件验证输出数据包含预期结果时,差异即使非常小(舍入问题)也很烦人,我必须找到解决方法.

这是一个示例程序:

#include <iostream>
#include <iomanip>
#include <bitset>

int main( int argc, char* argv[] )
{
    // this value was identified as producing different result when used as parameter to std::exp function
    unsigned char val[] = {158, 141, 250, 206, 70, 125, 31, 192};

    double var = *((double*)val);

    std::cout << std::setprecision(30);

    std::cout << "var is " << var << std::endl;
    double exp_var = std::exp(var);
    std::cout << "std::exp(var) is " << exp_var << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在Windows下,使用Visual 2015编译,我得到输出:

var is -7.87234042553191493141184764681
std::exp(var) …
Run Code Online (Sandbox Code Playgroud)

c++ rounding-error exp

6
推荐指数
1
解决办法
247
查看次数