这个问题要求编程语言接受数字常量以分配给任意精度变量或用于任意精度表达式,而不在表达式中赋值或应用之前执行到IEEE浮点表示的转换.例如,以下伪语言赋值表达式:
BigNum x = 0.1;
许多语言提供或可以访问库,这些库将允许从文本字符串构造这样的BigNum类型对象.我正在寻找可以将数字标记(如0.1)直接转换为BigNum的编程语言,而不需要程序员创建一个字符串,然后必须对其进行解析并在运行时抛出异常或标记错误.相反,我感兴趣的是编译器或标记器可以在将数字文字处理成任意精度十进制或整数比表示之前报告来自格式错误的数字或无效表达式的语法错误的语言.
从Rosetta Code网站上的Literals/Floating point开始,看起来像J,Maple和Maxima提供了任意精度浮点数的文字语法.是否有其他更广泛使用的语言提供与上面提供的伪示例相同或类似的内容?
作为一个具体的例子,Julia提供了对有理数的内置支持.这些数字具有可在源代码中使用的文字表示.例如:
x = 1//10
现在1 // 10和0.1在数学上是相同的数字 – 在基数10中.但是,大多数编程语言会将源代码中的文字十进制数转换为IEEE浮点数.通常这正是所需要的.然而,不少人不熟悉数字的IEEE浮点表示 – 或者类似的浮点表示已大致消失在历史中 – 令人惊讶地发现十分之一不是十分之一被转换成二进制分数.此外,这种惊喜通常出现在“大部分时间”工作的代码产生令人惊讶的结果之后,当浮点“错误”累积而非平均/抵消时.当然,这就是浮点表示和算术运算的本质,它们在实践中非常有用.警告经纪人:What Every Computer Scientist Should Know About Floating-Point Arithmetic
尽管如此,我发现有时整数不足,浮点数在其他精确计算中引入了不必要的问题.为此,有理数和任意精度库符合要求.大.但是,我仍然想知道是否有任何语言支持在语言本身中直接表示理性和任意精度文字.毕竟,我不想使用只有字符串文字的语言,然后必须在运行时将其解析为数字.
到目前为止,朱莉娅对理性数字来说是一个很好的答案,但远不是支持有理数字文字的唯一语言.但是,它没有任意精度文字.为此,J,Maple和Maxima似乎有我想要的东西.也许这几乎是完整的清单.不过,如果有人知道另一个或两个候选人,我会很感激指针……
答案到目前为止……
迄今为止最好的答案是Haskell.它提供了对numeric types和操作以及数字文字符号的丰富理解,其中包括有理数表达式,并且似乎提供了将小数部分作为有理数而不是浮点数字处理的十进制数.在所有情况下.至少,这是我从快速阅读Haskell文档和我遇到的一篇博文(Overloading Haskell numbers, part 3, Fixed Precision)中收集的内容,其中作者声明:
…notice that what looks like a floating point literal is actually a rational number; one of the very clever decisions in the original Haskell design.
对于许多程序员来说,Julia将更加平易近人,同时为各种数学类型和操作以及通常出色的性能提供出色的支持.然而,Python也有一个非常强大的语法,许多本地编译的软件包符合或超过了今天Julia可用的软件包,毫无疑问,它在商业,开源和学术项目中的应用程度和应用程度更高 – 如果我有选择,个人喜欢朱莉娅.
对于我自己,我将花费更多的时间来研究Haskell并重新访问Ocaml/F#,这可能是Julia / Python之类的语言和像Haskell这样的语言之间可行的中间选择 – 这些编程语言如何落入某种频谱中为读者锻炼身体.如果Ocaml / F#在我感兴趣的情况下提供与Haskell相当的表达能力,那么根据当前和未来可能的采用率,它们可能是更好的选择.但就目前而言,Haskell似乎是我原来问题的最佳答案.
最佳答案 Haskell的Rational由任意精度的Integers支持,并且它重载了数字文字,因此大多数情况下你的文字都具有你想要的类型.