递增或递减浮动

时间:2014-02-17 15:42:37

标签: ios objective-c macos floating-point

最低d是什么......

f - d != f
f + d != f

...对于任何CGFloat f(无穷大除外)?

例如,它不是1

CGFloat f = CGFLOAT_MAX;
CGFloat d = 1;
NSLog(@"%d", f - d != f); // Prints 0

4 个答案:

答案 0 :(得分:3)

如果“任何CGFLOAT”真正意味着CGFLOAT可以采用的任何值,那么答案就是无限。否则,f可能是无穷大(合法值),f-d对于任何有限值f都等于d

如果f限于有限值,则d为2 970 如果CGFLOAT_IS_DOUBLE设置为2 103 ,否则。这是因为当d被添加到CGFLOAT可能具有的最大有限值时,这些是导致更改所需的最小值。

这些无疑不是您正在寻找的价值观。正如Stephen Canon所说,你真正想做什么?

答案 1 :(得分:0)

f - d != f
f + d != f
对于所有可能的浮点数,

不固定。您可能已经得出了自己的结论,因为您可以清楚地看到,对于d = 1和f = 5.0,f-d = 4.0 ...但这不适用于CGFLOAT_MAX。

这是因为浮点数如何存储在内存中,它们以基数和指数存储,因此并非所有数字都被表示。

答案 2 :(得分:0)

这取决于您平台上CGFLOAT的定义。

当前平台使用float(通常在编译32位平台时)或double(通常在编译64位平台时)。

32位浮点数使用23位作为分数,这意味着d可能在CGFLOAT_MAX/2^23附近

64位双精度使用52位作为分数,这意味着d可能在CGFLOAT_MAX/2^52附近

答案 3 :(得分:0)

d的最小值取决于f的值。

问题是CGFloat仅支持一定数量的有效数字,并不是所有浮点数都准确表示。

以下不是确切的结果,而是用来说明问题。

如果f1.0,则d可能需要0.0000001。但如果f1000000.0(一百万),则d必须为0.1

基本上d的值必须在f的有效数字范围内,才能使结果显而易见。

考虑使用NSDecimalNumber能够完全代表大数字来消除此问题。