【问题标题】:How does converting float to double work?将 float 转换为 double 是如何工作的?
【发布时间】:2024-01-12 13:20:01
【问题描述】:

double 可以表示 float 可以表示的每个值。

将float转换为double是否只是通过添加0来扩展尾数并通过填充符号位来扩展指数部分?

我在http://www.binaryconvert.com/index.html 测试了一些数据。它以这种方式工作。但是我没有找到转换的任何官方定义。转换是否有任何极端情况不能以这种方式工作?

【问题讨论】:

  • 我想你问的是 IEEE-754(最常见的浮点格式),而不是 C 语言。后者基本上与它无关。

标签: c floating-point double ieee-754 single-precision


【解决方案1】:

这与 C 关系不大;它唯一的保证是从float 转换为double 必须保留该值。

所以你真的在问(大概)IEEE-754。至少有几种方式不符合您的描述:

  1. 单精度和双精度的指数具有不同的偏差。所以转换需要的不仅仅是符号扩展。

  2. 非正规数需要特殊处理(它们成为普通数)。

  3. NaN 可能还需要特殊处理 - 区分信令和静默 NaN 取决于尾数的值。

【讨论】:

  • 给定一个浮点值,我们还能知道它是非正规数还是正规数?我原以为所有非正规数都四舍五入为最接近的正规数。并且 float 中的所有正常数字在 double 中都必须是正常的。
  • 能否举个例子说明指数部分的偏差问题?
  • @JoeC - 指数定义为始终为正。转换可能相当于符号扩展,但我还没有完全考虑过;)
  • @JoeC - 如果指数为零且尾数非零,那么它是非正规的。