我正在尝试用 D 编程语言编写一个函数来替换对 C 的 strtold 的调用。(基本原理:要从 D 中使用 strtold,您必须将 D 字符串转换为 C 字符串,这是低效的。此外,strtold 不能在编译时执行。)我想出了一个最有效的实现,但我似乎在最低有效位上失去了一些精度。
该算法有趣部分的代码如下,我可以看到精度损失的来源,但我不知道如何摆脱它。(我省略了很多与核心算法无关的代码部分,以节省人们的阅读时间。)什么字符串到浮点算法将保证结果将尽可能接近 IEEE 编号行到由字符串表示的值。
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;
此外,我正在使用旧版本的单元测试,它执行以下操作:
assert(to!(real)("0.456") == 0.456L);
是否有可能我的函数产生的答案实际上比编译器在解析浮点文字时产生的表示更准确,但是编译器(用 C++ 编写)总是与 strtold 完全一致,因为它在内部使用 strtold 进行解析浮点文字?