【问题标题】:What are the limit values of int32 till which int32 to float conversion can work without rounding to nearest value?int32 的极限值是多少,直到 int32 到浮点转换可以工作而不四舍五入到最接近的值?
【发布时间】:2021-07-01 06:16:55
【问题描述】:

我正在尝试将 int32 值转换为浮点数,当我尝试转换 0x0FFFFF 以上的值时,最后一个小数点总是四舍五入到最接近的值。我知道当一个值不适合目标浮动成员时,它会被舍入,但我需要知道哪个是这个限制值。 例如11111111 (0x69F6BC7) 打印为 111111112.0 。

【问题讨论】:

  • 你能用你试过的代码 sn-p 更新问题吗?
  • @BharatS:这不是调试问题,不需要显示代码。问题很明确。
  • 您知道float 类型(大部分)只能准确存储大约 7 个十进制数字吗?
  • 问题是我正在使用一个名为 Embedded Wizard 的工具,它有自己的基于 c/cpp 的语言,但它只支持浮点而不是双精度。我开发了一个数字键盘,当用户按下 1111111.11 时,我将其存储为 111111111 并除以数字精度单位(在本例中为 100)。这样做时,我需要将 111111111 转换为浮点数,然后除以 100.0 以存储此值以供用户使用。

标签: c types integer


【解决方案1】:

float 有效数的最大整数值为FLT_RADIX/FLT_EPSILON - 1。有效数字的“整数值”是指缩放后的值,使其最低位表示值 1。

FLT_RADIX/FLT_EPSILON 也可以在float 中表示,因为它是基数的幂。 FLT_RADIX/FLT_EPSILON + 1float 中无法表示,因此如果整数的大小超过FLT_RADIX/FLT_EPSILON,将整数转换为float 可能会导致舍入。

如果已知INT_MAX 超过FLT_RADIX/FLT_EPSILON,您可以使用(int) (FLT_RADIX/FLT_EPSILON) < x 测试非负int x。如果不知道FLT_RADIX/FLT_EPSILON能否成功转换为int,则可能需要进行更复杂的测试。

C 实现通常使用 IEEE-754 binary32 格式,也称为“单精度”,用于float。在这种格式中,FLT_RADIX/FLT_EPSILON 是 224 = 16,777,216。

这些符号在<float.h> 中定义。对于doublelong double,将FLT_EPSILON 替换为DBL_EPSILONLDBL_EPSILONFLT_RADIX 保持不变,因为它对所有格式都相同。

理论上,不正常的浮点格式可能具有异常小的指数范围,这使得FLT_RADIX/FLT_EPSILON - 1 无法表示,因为有效数字无法缩放到足够高。这在实践中可以忽略。

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 2016-07-22
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多