预定义浮点类型
以下浮点类型是预定义的:
- float
- 通用浮点类型;它的大小曾经是平台相关的,但现在它总是映射到 float64 。一般应该使用这种类型。
- floatXX
- 实现可以使用此命名方案定义XX位的其他浮点类型(例如:float64是64位宽的浮点数)。 当前的实现支持 float32 和 float64 。 这些类型的字面值具有后缀 'fXX 。执行具有不同类型浮点类型的表达式中的自动类型转换:有关更多详细信息,请参阅 可转换关系 。 在浮点类型上执行的算术遵循IEEE标准。 整数类型不会自动转换为浮点类型,反之亦然。
IEEE标准定义了五种类型的浮点异常:
- 无效: 使用数学上无效的操作数的操作, 例如 0.0/0.0, sqrt(-1.0), 和log(-37.8).
- 除以零:除数为零,且除数是有限的非零数,例如1.0 / 0.0。
- 溢出:操作产生的结果超出指数范围,例如MAXDOUBLE + 0.0000000000001e308。
- 下溢:操作产生的结果太小而无法表示为正常数字,例如,MINDOUBLE * MINDOUBLE。
- 不精确:操作产生的结果无法用无限精度表示,例如,输入中的2.0 / 3.0,log(1.1)和0.1。IEEE异常在执行期间被忽略或映射到Nim异常: FloatInvalidOpError, FloatDivByZeroError, FloatOverflowError, FloatUnderflowError, 和 FloatInexactError 。 这些异常继承自 FloatingPointError 基类。
Nim提供了编译指示 nanChecks 和 infChecks 控制是否忽略IEEE异常或捕获Nim异常:
- {.nanChecks: on, infChecks: on.}
- var a = 1.0
- var b = 0.0
- echo b / b # raises FloatInvalidOpError
- echo a / b # raises FloatOverflowError
在当前的实现中, FloatDivByZeroError 和 FloatInexactError 永远不会被引发。 FloatOverflowError 取代了 FloatDivByZeroError 。 还有一个 floatChecks 编译指示用作 nanChecks 和 infChecks 的快捷方式。 floatChecks 默认关闭。
受 floatChecks 编译指示影响的唯一操作是浮点类型的 + , - , * , / 运算符。
在语义分析期间,实现应始终使用最大精度来评估浮点指针值; 这表示在常量展开期间,表达式 0.09'f32 + 0.01'f32 == 0.09'f64 + 0.01'f64 求值为真。