如何在Scala中定义新的基元数据类型及其行为

如何在Scala中定义新的基元数据类型及其行为,scala,types,fixed-point,Scala,Types,Fixed Point,有没有一种方法可以创建一种新的数据类型,我可以在其中定义Scala中的位数和算术规则?我有一个使用32位浮点的程序,但我正试图研究如何影响结果 我想重写程序,对定点(d.f)数进行加法和乘法运算,并返回相同精度的定点数(d.f,而不是d1+d2.f1+f2)。此外,我希望有饱和度,这样当有溢出时,结果将保持最大值,而不是环绕。如果有下溢,我还想截断位 据我所知,唯一的8位数字是短的,唯一的十进制数字是浮点数和双精度数。我可以在Scala中定义这个数据类型吗?或者,这是执行常规浮点运算并四舍五入到

有没有一种方法可以创建一种新的数据类型,我可以在其中定义Scala中的位数和算术规则?我有一个使用32位浮点的程序,但我正试图研究如何影响结果

我想重写程序,对定点(d.f)数进行加法和乘法运算,并返回相同精度的定点数(d.f,而不是d1+d2.f1+f2)。此外,我希望有饱和度,这样当有溢出时,结果将保持最大值,而不是环绕。如果有下溢,我还想截断位

据我所知,唯一的8位数字是短的,唯一的十进制数字是浮点数和双精度数。我可以在Scala中定义这个数据类型吗?或者,这是执行常规浮点运算并四舍五入到最接近的数字(可以由我想要的类型表示)的唯一方法吗


谢谢

除非您去破解JVM,或者使用一些自定义编译器设置将Scala编译为本机代码,否则您将受到JVM提供和支持的类型的限制


更合理的方法是将数字存储为分数。有一些这样的库可以让你这样做。使用Spire,您还可以选择
Double
Rational
速度/精度权衡。

您不能真正定义基本数据类型。但在Scala中,您可以定义一个类,例如,
类FixedPoint(x:Long)扩展AnyVal
。在运行时,它在大多数情况下(但不总是!)都会被表示为
Long

另一个答案中提到的Spire有一个

该值类使用带有隐式分母的Long。类型本身不包含有关分母的信息。相反,需要隐式的
FixedScale
实例在必要时(例如,在乘法过程中)提供该上下文。与前面的无符号值一样,固定点值在大多数情况下不会装箱

这种类型的设计是为了解决特定类型的问题,应该只在需要大量具有相同分母的有理数的情况下使用,并且效率非常重要

我也不认为它的运作是饱和的(尽管我不确定)