相关疑难解决方法(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万
查看次数

如何以完美的准确度将字符串转换为浮点数?

我正在尝试用D编程语言编写一个函数来替换对C的strtold的调用.(基本原理:要使用来自D的strtold,你必须将D字符串转换为C字符串,这是低效的.另外,strtold不能在编译时执行.)我想出了一个主要有效的实现,但是我似乎在最不重要的位上失去了一些精确度.

算法的有趣部分的代码如下,我可以看到精度损失来自哪里,但我不知道如何摆脱它.(我遗漏了许多与核心算法无关的代码部分,以节省人们的阅读.)什么字符串到浮点算法将保证结果尽可能接近IEEE编号line到字符串表示的值.

real currentPlace = 10.0L ^^ (pointPos - ePos + 1 + expon);

real ans = 0;
for(int index = ePos - 1; index > -1; index--) {
    if(str[index] == '.') {
        continue;
    }

    if(str[index] < '0' || str[index] > '9') {
        err();
    }

    auto digit = cast(int) str[index] - cast(int) '0';
    ans += digit * currentPlace;
    currentPlace *= 10;
}

return ans * sign;
Run Code Online (Sandbox Code Playgroud)

此外,我正在使用旧版本的单元测试,其中包括:

assert(to!(real)("0.456") == 0.456L);
Run Code Online (Sandbox Code Playgroud)

我的函数生成的答案是否有可能比解析浮点文字时编译器生成的表示更准确,但编译器(用C++编写)总是与strtold完全一致,因为它在内部使用strtold进行解析浮点文字?

floating-point d floating-accuracy

10
推荐指数
2
解决办法
4019
查看次数