这个问题要求编程语言接受数字常量以分配给任意精度变量或用于任意精度表达式,而不在表达式中赋值或应用之前执行到IEEE浮点表示的转换。例如,以下伪语言赋值表达式:
BigNum x = 0.1;
许多语言提供或可以访问库,这些库将允许从文本字符串构造此类BigNum
类型对象。我正在寻找可以将0.1
之类的数字标记直接转换为BigNum
的编程语言,而不需要程序员创建一个必须进行解析的字符串,并可能在运行时抛出异常或标记错误。相反,我感兴趣的是编译器或标记生成器可以在将数字文字处理成任意精度十进制或整数比率表示之前报告来自格式错误的数字或无效表达式的语法错误的语言。
来自Literals/Floating point网站上的Rosetta Code,看起来J,Maple和Maxima为任意精度浮点数提供了字面语法。是否有其他更广泛使用的语言提供与我上面提供的伪示例相同或类似的内容?
作为一个具体的例子,Julia提供了对有理数的内置支持。这些数字具有可在源代码中使用的文字表示。例如:
x = 1//10
现在1//10
和0.1
在数学上是相同的数字 - 在基数10中。但是,大多数编程语言会将源代码中的文字十进制数转换为IEEE浮点数。通常这正是所需要的。然而,不少人不熟悉IEEE浮点表示的数字 - 或者类似的浮点表示已经大大淡化到历史中 - 令人惊讶的是,十分之一并不是十分之一当它被转换成二进制分数。此外,这种惊喜通常出现在代码之后,大部分时间都可以使用#34;当出现浮点错误时,会产生令人惊讶的结果。积累相当平均/抵消。当然,这就是浮点表示和算术运算的本质,它们在实践中非常有用。警告:What Every Computer Scientist Should Know About Floating-Point Arithmetic
尽管如此,我发现有时整数不足并且浮点数在其他精确计算中引入了不必要的问题。为此,有理数和任意精度库符合要求。大。但是,我仍然想知道是否有任何语言支持在语言本身中直接表示理性和任意精度文字。毕竟,我不想使用只有字符串文字的语言,然后必须在运行时将其解析为数字。
到目前为止,朱莉娅对理性数字来说是一个很好的答案,但远不是支持有理数字文字的唯一语言。但是,它没有任意精度文字。为此,J,Maple和Maxima似乎有我想要的东西。也许这几乎是完整的清单。不过,如果有人知道另一个或两个候选人,我会很感激指针......
答案到目前为止......
迄今为止的最佳答案是Haskell。它提供了对numeric types和操作以及数字文字符号的丰富理解,其中包括有理数表达式,并且似乎提供了将小数部分作为有理数而不是浮点文字处理的十进制数。至少,这是我通过快速阅读Haskell文档和我遇到的博客文章Overloading Haskell numbers, part 3, Fixed Precision收集的内容,其中作者声明:
...注意看起来像浮点字面值实际上是一个有理数;原始Haskell设计中非常聪明的决定之一。
对于许多程序员来说,Julia将更加平易近人,同时为各种数学类型和操作以及通常出色的性能提供出色的支持。但是,Python也有一个非常强大的语法,许多本地编译的软件包符合或超过了今天Julia可用的软件包,毫无疑问,它在商业,开源和学术项目中得到了更多的采用和应用 - - 不过,如果我有选择的话,我个人更喜欢朱莉娅。
对于我自己,我将花费更多的时间来研究Haskell并重新访问Ocaml / F#,这可能是Julia / Python之类语言和Haskell之类的语言之间可行的中间选择 - 这些编程语言如何可能会落在某种频谱上,留给读者练习。如果Ocaml / F#在我感兴趣的情况下提供与Haskell相当的表达能力,那么根据当前和未来可能的采用率,它们可能是更好的选择。但就目前而言,Haskell似乎是我原来问题的最佳答案。
答案 0 :(得分:1)
在Smalltalk中,Visualworks扩展了st-80语法,以便引入1.23s,它是FixedPoint的一个实例(不是一个好名字......),内部表示为理性分数123/100
该数字的行为与分数完全相同,分数可以具有任意长分子和分母,并执行精确算术,但它具有一些特定的打印规则:它在小数分数分隔符后舍入到固定的小数位数。 1.23s4轮到4位小数 - > '1.2300'1.23s轮次提供小数位数,因此2。
在Visualworks之后,大多数Smalltalk方言添加了一些等效的类和相同的文字语法。在Squeak中,该类名为ScaledDecimal,但在Compiler中只实现了1.23s2语法。 Pharo将在版本3.0中包含1.23s。
答案 1 :(得分:1)
Haskell的Rational由任意精度的Integers支持,并且它重载了数字文字,因此大多数情况下你的文字都具有你想要的类型。
答案 2 :(得分:0)
在Scheme中,有两种数字,精确和不精确,与数字类型(整数,有理,真,复)正交的区别。对不精确数字的操作产生不精确的结果,不精确的数字通常实现为IEEE浮点数。为方便起见,假设一个带小数点或指数的数字文字是不精确的,而一个没有被认为是精确的,所以1和1/10和1 + 2i是精确的,而1.0和0.1和1.0 + 2.0i是不精确。但你可以通过在文字前面加上#e来使其完全或#i使其不精确来覆盖它,所以#e3.0与3相同,#e0.1与1/10相同,#i1 / 10与0.1相同。