【问题标题】:Is it possible to predict if a mathematical operation would result in an overflow?是否可以预测数学运算是否会导致溢出?
【发布时间】:2010-08-19 22:02:31
【问题描述】:

假设您有 2 个数字,对于每个典型的数学运算,是否可以预测(没有显着开销)这些运算是否会导致这些数字当前表示的类型的溢出?

【问题讨论】:

    标签: math programming-languages numbers precision


    【解决方案1】:

    是的。

    为简单起见,假设溢出发生在 100 处。

    a * b >= 100,我们溢出了

    因此,对于a = n,如果b >= 100 / n,我们就有溢出。如果ab 为0,则没有溢出。

    这不适用于任何需要增加右手常数的数学设置,因为您的溢出检测会溢出。但是,操作的任何给定步骤都可能溢出,因此您确实需要在机器级别而不是算法级别发生之前检查每个加法和乘法。因此,您需要将问题划分为已知的最小数量,以有效使用此溢出检测。

    我宁愿让语言抛出异常,但这就是我。

    【讨论】:

    • 在一天结束的时候,让语言除了(在特殊情况下)可能比跳过箍试图覆盖所有可能溢出的情况更便宜。
    • 不幸的是旧语言不走这条路,幸运的是新语言没有这个问题,除非你的内存用完了:P
    • “除非你的内存用完了”是正确的吗?当算术运算产生的结果超出运算返回的数据类型范围时,就会发生溢出异常。
    【解决方案2】:

    打开溢出保护,然后应用操作。如果抛出溢出异常,或者错误寄存器设置了溢出位,或者您的环境告诉您该问题,那么您知道如果再次执行此操作,您将获得溢出。

    【讨论】:

    • 并非所有机器都有此功能。
    【解决方案3】:

    求和:

    MAX_NUMBER - A < B
    

    会有溢出

    【讨论】:

    • 如果 A 为负数,那么您的测试将溢出
    • @Paul R 你说得对,需要检查 A>0。并检查两者是否为负是否会溢出 MIN_NUMBER。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2010-09-30
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    相关资源
    最近更新 更多