我有一个x
类型为float
的变量,需要获取它的小数部分。我知道可以使用以下两种方法来获取其小数部分:
x - floorf(x)
fmodf(x, 1.0f)
我的问题是:其中一种方法总是比另一种更好吗?它们是否有效地相同?还有第三种替代方案吗?
注:
- 如果答案取决于我正在使用的处理器,请让它是x86_64,并且如果您能详细说明其他处理器的行为,那就太好了。
- 请确保并参考
x
的负值的行为。我不介意这个行为或者那个行为,但我需要知道这个行为是什么。
我有一个x
类型为float
的变量,需要获取它的小数部分。我知道可以使用以下两种方法来获取其小数部分:
x - floorf(x)
fmodf(x, 1.0f)
我的问题是:其中一种方法总是比另一种更好吗?它们是否有效地相同?还有第三种替代方案吗?
注:
x
的负值的行为。我不介意这个行为或者那个行为,但我需要知道这个行为是什么。我认为x - floorf(x)
是相当好的(精确的),但在某些情况下不适用:
modff对于int和frac部分都尊重-0.0符号位,并且对于+/-inf分数部分回答+/-0.0-至少如果实现支持IEC 60559标准(IEEE 754)。
inf的原理可能是:由于每个大于2 ^ precision的浮点数都具有空分数部分,因此对于无限的浮点数也必须如此。
这只是小问题,但仍然不同。
编辑当应用于具有小数部分的负浮点数时,x - floor(x)
最明显的缺陷是错误的。例如,对于-2.25,它将返回+0.75,这不是我们所期望的...
由于使用了c99标签,x - truncf(x)
会更正确,但仍然会受到我最初关注的小问题的影响。
x
,floorf
将是比 x
小的最接近的整数。因此,例如 -3.2
,我们将得到 -4.0
,这将产生 -3.2 - (-4.0) = 0.8
,这不仅是错误的符号。 - StoryTeller - Unslander Monica