gpt4 book ai didi

julia - 是否可以告诉 Julia 将 0.0/0.0 解释为 1?

转载 作者:行者123 更新时间:2023-12-02 00:39:49 27 4
gpt4 key购买 nike

我正在处理一些 Float64 函数,它们在其内部计算一些可以取值 0.0/0.0 的分数。在这种情况下,该值应解释为 1.0。是否可以自动执行此操作并避免对病态案例进行编码?

最佳答案

是的,以安全的方式执行此操作相当简单,不会破坏 Julia 或其他人的代码。

实现此目的的一种方法是在模块内部或在 REPL 中,在显式使用 / 函数[1]之前,只需编写

/(args...) = Base.:(/)(args...)

function /(x::Float64, y::Float64)
if x == 0.0 && y == 0.0
1.0
else
Base.:(/)(x, y)
end
end

在回复中:

julia> 1 / 2
0.5

julia> 10.0 / 0.0
Inf

julia> 0.0 / 0.0
1.0

它的作用是隐藏内置的/函数,并将其替换为您自己的依赖于内置函数的自定义版本。此阴影仅适用于您所在的当前模块,并且不会泄漏到外部,除非有人明确询问您的版本。

另一个(也许更好)选择是通过 unicode 运算符创建新的中缀除法函数。这是一个例子:

function /̂(x, y) # /̂ is typed /\hat<TAB> at the REPL
if x == 0 && y == 0
one(promote_type(typeof(x), typeof(y)))
else
x / y
end
end

在 REPL 上:

julia> 0 /̂ 0.0
1.0

julia> 1 /̂ 2
0.5

julia> 0 / 0
NaN

这是有效的,因为任何时候您将 unicode 修饰符(如 \hat)或上标或其他任何内容应用于中缀函数符号(如 /*) > 或其他)你创建一个具有相同优先级的新中缀运算符。这很好,因为我们可以保留旧的 / 定义,并且我们的除法运算符上有一个视觉标记,表明正在发生一些奇怪的事情。

享受吧!

<小时/>

[1]:来自 Base 的函数仅在您第一次使用时才会实际拉入您的命名空间,因此,如果您尚未在当前作用域中使用 /,您可以随意隐藏它。否则,您必须通过 let block 引入一个新作用域,并且仅在其中隐藏 /

关于julia - 是否可以告诉 Julia 将 0.0/0.0 解释为 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58020700/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com