【问题标题】:Why Float error is different in C? [closed]为什么浮点错误在 C 中不同? [关闭]
【发布时间】:2017-11-17 09:16:11
【问题描述】:

请看图片:

我很惊讶结果是不同的。

【问题讨论】:

  • 浮点数只有大约 7 位小数的精度。您通过将两个浮点数相除来计算price2。 (您对结果所做的操作不会改变该结果的计算方式。将其存储在 CGFloat 中不会导致除法保持如此高的精度。)
  • 将纯文本显示为文字而不是图片真的太难了吗?
  • 您的文字图片isn't very helpful。它无法大声朗读或复制到编辑器中,并且索引不是很好,这意味着有相同问题的其他用户不太可能在这里找到答案。请edit您的帖子直接合并相关文本(最好使用复制+粘贴以避免转录错误)。
  • 不是那个副本。

标签: objective-c c floating-point precision


【解决方案1】:

CGFloat 在 64 位平台上实际上是 double。 (在旧的 32 位平台上是 float。)

所以在这里你将double除以double

CGFloat price    =    88888736      /     a;
        ^^^^^         ^^^^^^^^            ^
       double        int -> double      double

在这里,您将double 除以float

CGFloat price2    =   88888736     /   100.0f;
        ^^^^^^        ^^^^^^^^         ^^^^^^
        double       int -> double      float

100.0f 更改为100.0(CGFloat)100,应该没问题。

LIVE DEMO

【讨论】:

  • 也许不明显的部分是第一个除法是double 除法,因为它除以一个整数文字和一个double,第二个是float 除法,因为它除以整数文字和float 文字。
  • @Sulthan:谢谢 - 我现在添加了更详细的解释。
  • 自去年 11 月以来,您没有回答过任何问题。发生了什么?似乎 SO 已经放缓了。
  • @Zboson:呵呵 - 非常敏锐 - 这实际上只是多种因素的组合:工作和家庭事务非常忙碌 + 这些天有更多的 SIMD 专家(Peter Cordes 非常多产!)+ 多数的新问题似乎质量低或重复。不过还是在这里... ;-)
【解决方案2】:

CGFloat 是您机器上的double,因此您正在做的是:

double a = 100.00f
double price = 88888736 / a

float a2 = 100.00f // `float` type enforced by the trailing `f`
double price2 = 88888736 / a2

不同之处在于,在第一种情况下,除法是double,而在第二种情况下,这是float 除法,结果然后分配给double。由于float 除法的精度较低,因此您会得到您所看到的结果。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 2023-01-31
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多