代码之家  ›  专栏  ›  技术社区  ›  einpoklum

我应该如何获得浮点值的小数部分?

  •  0
  • einpoklum  · 技术社区  · 4 年前

    我有一个变量 x 类型 float 我需要它的分数部分。我知道我能搞定

    • x - floorf(x) ,或
    • fmodf(x, 1.0f)

    我的问题是:其中一个总是比另一个好吗?它们实际上是一样的吗?我可以考虑第三种选择吗?

    笔记:

    • 如果答案取决于我使用的处理器,让我们将其设置为x86_64,如果你能详细说明其他处理器,那就太好了。
    • 请确保并参考负值的行为 x 我不介意这种或那种行为,但我需要知道这种行为是什么。
    1 回复  |  直到 4 年前
        1
  •  6
  •   einpoklum    4 年前

    我可以考虑第三种选择吗?

    它有专门的功能。 modff 存在将一个数分解为其整数和分数部分。

    float modff( float arg, float* iptr );

    分解给定的浮点值 arg 分为整数和分数 零件,每个零件的类型和符号与 arg .整体部分 (以浮点格式)存储在以下对象中: iptr .

        2
  •  2
  •   aka.nice    4 年前

    我会这么说 x - floorf(x) 很好(准确),除了角落的情况

    • 它对负零或任何其他负整浮点数的符号位错误 (我们可能会期望分数部分磨损相同的符号位)。
    • 它与inf配合得不太好

    modff确实对int和frac部分都尊重-0.0符号位,对+/-inf分数部分回答+/-0.0——至少在实现支持IEC 60559标准(IEEE 754)的情况下是这样。
    inf的一个基本原理可能是:由于每个大于2^精度的浮点数都有一个空分数部分,因此对于无限浮点数来说也必须如此。

    这很小,但还是不同的。

    编辑 呃,当然,正如@StoryTeller UnslanderMonica所指出的那样,最明显的缺陷是 x - floor(x) 是针对带有分数部分的负浮点的情况,因为应用于-2.25,它将返回+0.75,这不是我们所期望的。。。

    由于使用了c99标签, x - truncf(x) 会更正确,但仍然存在我最初关注的小问题。