我编写了一个函数,输出一个double,最多小数点25位。我正在尝试将其打印为来自Raku的格式化输出。
但是,输出是不正确的和截断的。
见MWE:
my $var = 0.8144262510988963255087469;
say sprintf("The variable value is: %.25f", $var) 上面的代码给出了The variable value is: 0.8144262510988963000000000,而这并不是预期的那样。
而且,这似乎很奇怪:
my $var = 0.8144262510988963255087469;
say $var.Str.chars; # 29 wrong, expected 27我在C上做了同样的测试
#include <stdio.h>
int main() {
double var = 0.8144262510988963255087469;
printf("The variable value is: %.25lf \n", var);
return 0;
}不过,它很好用。考虑到sprintf和printf的性质相同,我希望这个C示例也能在Raku中工作。看来%lf是不支持。
有办法解决这个问题吗?
发布于 2022-01-11 12:09:20
我认为这实际上是Rat文本创建方式中的一个缺陷。或者至少是WAT :-)
实际上,我希望0.8144262510988963255087469给出编译时警告,或者创建一个Num,因为它超过了Rat的标准精度。
raku -e 'say 0.8144262510988963255087469'
0.814426251098896400086204416注意,它们是不一样的。
幸运的是,通过创建一个FatRat,有一个简单的解决方法
$ raku -e 'say 0.8144262510988963255087469.FatRat'
0.8144262510988963255087469FWIW,我认为这是值得制造问题
发布于 2022-01-14 21:53:43
从你的问题中:
我写了一个函数,输出一个双小数点,最多25位。
来自谷歌:
双精度数字的精度可达小数点16位
来自raku 文档:
但是,在构造鼠时(即当它不是某种数学表达式的结果)时,可以使用更大的分母。
所以如果你去
my $v = 0.8144262510988963255087469;
say $v.raku;
#<8144262510988963255087469/10000000000000000000000000>它起作用了。
然而,做一个数学表达式,例如
my $b = $a/10000000000000000000000000;并且,除非显式声明=>,否则将应用鼠FatRats的Num退化。我将其形象化为数学运算,将结果放入CPU中的Num寄存器中。
文档还提到,.say和.put可能不像.raku那么忠实,大概是因为它们在内部使用数学操作(或强制)。
很抱歉,作为坏消息的传递者,但是10**25 >2 **64,但是考虑到IEEE双精度P754的限制,您报告的问题是正确的&(公平)记录在案的行为。
https://stackoverflow.com/questions/70662967
复制相似问题