【问题标题】:Swift zero divided by zero gives NANSwift 零除以零得到 NAN
【发布时间】:2015-04-02 05:46:48
【问题描述】:

我正在使用 Swift 进行一些计算。我知道在 Swift 中,0/0 给出 NAN(不是数字)而不是 0。无论如何它是否返回 0?

for x in 0..<n {
for y in 0..<n {
if(B[0,y,x]==NAN) {B[0,y,x]=0 }    //use of undeclared identifier 'NAN'

println("\((Float)B[0,y,x])")

}
}

【问题讨论】:

  • 出于好奇,您为什么要这样做?
  • 在您自己的代码中?还是在某个图书馆?如果在您自己的代码中,您可以添加一个if
  • 因为这段代码涉及到一定的工程计算。我希望返回零以显示用户为零而不是 nan。因为使用这个程序的用户,不知道nan是什么意思...
  • 不要夸大可能不明显的东西,但零除以零不是零,它是无穷大/未定义,这就是为什么你得到NaN(或崩溃) 在大多数语言中。如果您想将这个特殊的极端情况转换为用户的一些不同输出,请检查零分母并退出返回您想要的任何内容。
  • 这个 if 语句代码有效吗?

标签: ios swift


【解决方案1】:

NaN 在FloatingPointType 协议中定义。
Which is the Swift equivalent of isnan()?

那么,如果你想要零,使用Overflow Operators怎么样?

let x = 1
let y = x &/ 0
// y is equal to 0

[更新]

您可以像这样定义自定义溢出运算符。

func &/(lhs: Float, rhs: Float) -> Float {
    if rhs == 0 {
        return 0
    }
    return lhs/rhs
}

var a: Float = 1.0
var b: Float = 0

// this is 0
a &/ b

【讨论】:

  • c[x] = B[0,y,x] &/ B[0,x,x]
  • c[x], B[0,y,x] 是浮点型。溢出运算符给我一个“浮点”类型的错误不符合协议“_IntegerARithmeticType”
  • 谁能告诉我 &/ 在做什么?
【解决方案2】:

来自@bluedome 的好答案,如果您希望将此作为扩展名并且\或有任何错误,则有答案

infix operator &/ {}

extension CGFloat {
    public static func &/(lhs: CGFloat, rhs: CGFloat) -> CGFloat {
        if rhs == 0 {
            return 0
        }
        return lhs/rhs
    }
}

然后你可以除以零

let a = 5
let b = 0
print(a &/ b) // outputs 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多