【问题标题】:Handling division by zero in graphics code在图形代码中处理除以零
【发布时间】:2012-05-29 13:00:39
【问题描述】:

我正在编写一个用于程序图像生成的库 (Clisk),它允许用户定义自己的数学函数来生成图像。

他们显然可以定义一个函数,该函数可能导致某些像素被零除,例如(伪代码)

red = 1.0 / (xposition - 0.5)

每当 xposition = 0.5(图像中间)时,这将导致除以零

理想情况下,我不希望图像生成崩溃...但同时我不想创建一个笨拙的 hack 来忽略​​除零,这会在以后引起问题。

什么是处理这些案例的良好、稳健、系统的方法?

【问题讨论】:

标签: java math image-processing clojure divide-by-zero


【解决方案1】:

我真的不是图形程序员,但你可以做

 private static final double MIN_X = 0.0000001

 red = 1.0 / Math.max(xpos - 0.5, MIN_X);

显然,如果您允许负数,您可能必须在其中删除一个绝对值

【讨论】:

    【解决方案2】:

    理想情况下,我不希望图像生成崩溃...但同时我不想创建一个笨拙的 hack 来忽略​​除零,这会在以后引起问题。

    (我假设您的意思是 sn-p 是一些用户提供的代码的示例......)

    显然,如果用户提供的代码可能引发异常,那么您将无法阻止这种情况的发生。 (并且在除法之前检查的建议显然与您无关。)

    那么除了“崩溃”之外,您还能做什么?生成空图像?忽略用户的功能?你会产生垃圾......这不是用户需要的。

    您当然无法访问并修复他/她的 java 代码。 (如果该 sn-p 是用某种自定义语言编写的代码,那么您也无法访问并更正它。您/您的库不知道用户提供的代码应该是什么他们正在做...)

    没有。我认为 最好的 答案是将来自用户提供的代码的任何意外(未经检查的)异常包装在您自己的异常中,清楚地告诉用户他的代码中发生了错误。然后由调用您的库代码的应用程序代码来处理异常还是“崩溃”。


    如果您要求用户使用“良好、健壮、系统的方法”来编写他们的功能,我认为您是在找错树。这不是您真正关心的问题...

    【讨论】:

      【解决方案3】:

      你总是可以只提供一个参数询问他们在被零除时做什么。毕竟这是他们的代码——他们应该知道什么最适合他们的情况。

      那么问题就变成了,该参数的合理默认值是多少?我想说 "return 0.0""throw an exception" 对于这个应用程序来说都是合理的。只要确保你记录下来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        • 1970-01-01
        相关资源
        最近更新 更多