3.1.3 认识浮点类型
仓颉浮点类型有3种:Float16(半精度浮点类型)、Float32(单精度浮点类型)和Float64(双精度浮点类型),分别表示在存储浮点数时使用的二进制位数为16位、32位和64位。这3种浮点类型的精度从高到低依次为:Float64 > Float32 > Float16。
代码清单3-1 precision_float_type.cj
01 from std import format.* 02 03 main() { 04 let x: Float16 = 0.7438734374037310774 05 let y: Float32 = 0.7438734374037310774 06 let z: Float64 = 0.7438734374037310774 07 08 println(x.format(".18")) // 输出:0.743652343750000000 09 println(y.format(".18")) // 输出:0.743873417377471924 10 println(z.format(".18")) // 输出:0.743873437403731130 11 }
在代码清单3-1中,我们将一个小数位数较多的浮点类型字面量分别存入3个不同精度类型的浮点类型变量(Float16类型的x、Float32类型的y和Float64类型的z),然后读取变量值。在读取变量值时,为了观察3个变量的精度,使用了format函数将输出精度指定为小数点后18位。通过示例程序,可以发现不同浮点类型的精度是不同的:Float16的精度约为小数点后3位,Float32的精度约为小数点后7位,Float64的精度约为小数点后15位。
1.浮点类型字面量的形式
一个不带指数部分的浮点类型字面量的形式如下:
[整数部分].小数部分
以下是一些合法的浮点类型字面量:
1.234 // 同时包含整数部分和小数部分 .5 // 只包含小数部分,不包含整数部分
另外,浮点类型字面量可以使用科学记数法表示。在浮点类型的科学记数法中,指数部分以“e”或“E”为前缀,底数为10。对于带指数部分的浮点类型字面量,至少要包含整数部分或小数部分,如果不包含小数部分,那么可以省略小数点。
以下是一些以科学记数法表示的合法的浮点类型字面量:
2E3 // 表示2×103,即2000.0 .6e2 // 表示0.6×102,即60.0 9.8e-3 // 表示9.8×10-3,即0.0098
提示
浮点类型字面量也可以使用下画线(_)作为分隔符。
2.浮点类型字面量的后缀
在使用十进制浮点类型字面量时,也可以给字面量后面加上类型后缀。十进制浮点类型与类型后缀的对应关系如表3-3所示。
表3-3 十进制浮点类型与类型后缀的对应关系
以下是一些使用了类型后缀的十进制浮点类型字面量:
99.8f64 // Float64类型的字面量99.8 0.35f16 // Float16类型的字面量0.35 1.21e3f32 // Float32类型的字面量1210.0
练习
分别将同一个小数位数较多的浮点类型字面量赋给不同浮点类型的变量,通过函数format和println观察不同浮点类型的精度。