给定一个值(即44100.0f)并乘以另一个(或其倍数)(即1/8 = 2/16)是否会给出不同的值?
示例:
44100.0 * 1/8 != 44100.0 * 2/16
或
44100.0 * 1/8 != 44100 * 2 / 16
这是因为我做这样的事情:
float patternLength = 44100.0f;
float steps = 8.0f;
float position = 1.0f;
float stepLength = patternLength / steps;
int result = (int)std::round(position * stepLength);
这给出5513
(因为它将5512.5
舍入为5513
),但是如果结果是5512,4999999
怎么办?它将四舍五入到5512
。
这是我的麻烦:无论乘数(及其倍数)如何,我都必须确保它们采用相同的值。
我需要在回合前加总某种EPSILON
吗?还是Floating Point Math可以开箱即用地向我保证?
IEEE754答案
IEEE754浮点规范要求返回最接近算术运算的浮点值。
因此1/8与2/16相同。
当然,我假设分子和分母都可以精确表示,可以是小的整数。
一般回答
通常,C ++浮点确实做到这一点。