首页
学习
活动
专区
圈层
工具
发布

Raku格式
EN

Stack Overflow用户
提问于 2022-01-11 07:21:51
回答 2查看 185关注 0票数 7

我编写了一个函数,输出一个double,最多小数点25位。我正在尝试将其打印为来自Raku的格式化输出。

但是,输出是不正确的和截断的。

见MWE:

代码语言:javascript
复制
my $var = 0.8144262510988963255087469;
say sprintf("The variable value is: %.25f", $var) 

上面的代码给出了The variable value is: 0.8144262510988963000000000,而这并不是预期的那样。

而且,这似乎很奇怪:

代码语言:javascript
复制
my $var = 0.8144262510988963255087469;

say $var.Str.chars; # 29 wrong, expected 27

我在C上做了同样的测试

代码语言:javascript
复制
#include <stdio.h>

int main() {
   double var = 0.8144262510988963255087469;
   printf("The variable value is: %.25lf \n", var);

   return 0;
}

不过,它很好用。考虑到sprintfprintf的性质相同,我希望这个C示例也能在Raku中工作。看来%lf不支持

有办法解决这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2022-01-11 12:09:20

我认为这实际上是Rat文本创建方式中的一个缺陷。或者至少是WAT :-)

实际上,我希望0.8144262510988963255087469给出编译时警告,或者创建一个Num,因为它超过了Rat的标准精度。

代码语言:javascript
复制
raku -e 'say 0.8144262510988963255087469'
0.814426251098896400086204416

注意,它们是不一样的。

幸运的是,通过创建一个FatRat,有一个简单的解决方法

代码语言:javascript
复制
$ raku -e 'say 0.8144262510988963255087469.FatRat'
0.8144262510988963255087469

FWIW,我认为这是值得制造问题

票数 5
EN

Stack Overflow用户

发布于 2022-01-14 21:53:43

从你的问题中:

我写了一个函数,输出一个双小数点,最多25位。

来自谷歌:

双精度数字的精度可达小数点16位

来自raku 文档

但是,在构造鼠时(即当它不是某种数学表达式的结果)时,可以使用更大的分母。

所以如果你去

代码语言:javascript
复制
my $v = 0.8144262510988963255087469; 
say $v.raku;
#<8144262510988963255087469/10000000000000000000000000>

它起作用了。

然而,做一个数学表达式,例如

代码语言:javascript
复制
my $b = $a/10000000000000000000000000;

并且,除非显式声明=>,否则将应用鼠FatRats的Num退化。我将其形象化为数学运算,将结果放入CPU中的Num寄存器中。

文档还提到,.say和.put可能不像.raku那么忠实,大概是因为它们在内部使用数学操作(或强制)。

很抱歉,作为坏消息的传递者,但是10**25 >2 **64,但是考虑到IEEE双精度P754的限制,您报告的问题是正确的&(公平)记录在案的行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70662967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档