奇思妙想 · 2024年 3月 29日 0

不同的浮点数类型

93 次浏览

尽管4字节的浮点数可表达相当大的数值,但对于人类而言,总不够用。一般而言,浮点数有3种类型,单精度的float和双精度的double以及更长的long double, 可参考:数据类型大小

不同语言的浮点数类型

  • C/ObjC/C++: float / double / long double
  • 仓颉:Float16 / Float32 / Float64
  • C#: float double decimal
  • Pascal: real single double extended comp
  • 在PHP 4之前,浮点数类型被标识为doublefloatdouble在PHP中是同义词,都代表双精度浮点数。PHP4之后,float是单精度,double是双精度,不过二者经常可以互换。
  • Kotlin: Float和Double
  • VB: Single Double

浮点数形式

  • 十进制形式: 例如12.34
    • C/ObjC/C++/仓颉/C#/Java/Pascal/PHP/Kotlin/VB 等
  • 指数形式:1.5E2 (格式aEb,a和b都是十进制数,a可包含小数点)
    • C/ObjC/C++/仓颉/C#/Java/Pascal/PHP/Kotlin/VB 等
    • 注意,VB语言用E/e表示指数是Single类型,用D/d表示Double类型的指数。

特别的,Pascal不允许1.或者.2E5这种形式,小数点前后必须有数字。这与普通C语言有差异。

浮点数类型的差异

  • C语言为了区分float和double, 输入时用%f代表float, %lf代表double, 但对于输出%f和%lf作用相同。
  • C99引入了long double (%Lf), 注意并不意味long double一定比double要长,根据编译器选择。
  • C# float用f或者F后缀,double用d或者D后缀。
  • Kotlin float类型需要用f或者F后缀,double类型不允许加d或者D后缀。

浮点数字面量区分单精度或双精度

  • C/ObjC/C++/Kotlin: 浮点数后缀f或F代表单精度float,不加默认是double.
  • 仓颉:f16 / f32 / f64后缀区分三种浮点数。

浮点数默认转换

  • C语言中float类型是默认转换成double去处理,如下图所示。

浮点数格式串

  • C/ObjC/C++ %f代表基本浮点数类型,%e是科学计数法格式,%g是简短模式。

C语言是如何区分开%f和%lf的?