Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I seperate negative zero from positive zero?

I want to be able to test if zero is positive or negative in swift.

let neg: CGFloat = -0
let pos: CGFloat = +0

if pos == neg {
    // this gets executed, but I don't want this
}

The code above does not work like I need it to, can someone help me?

Thank you ;)

like image 931
swift-lynx Avatar asked Oct 25 '18 07:10

swift-lynx


2 Answers

There are “negative zero” and “positive zero” floating point numbers. You can disambiguate them by checking the .sign property, but they (intentionally) compare as equal:

let neg: CGFloat = -0.0
let pos: CGFloat = +0.0

print(neg.sign) // minus
print(pos.sign) // plus
print(neg == pos) // true

if (neg == pos && neg.sign == pos.sign) {
    // This is not executed.
}

Note that you have to use floating point literals ("-0.0" or "+0.0") in the initialization. The integer literals ("+0", "-0") are equal and converted to positive zero.

like image 167
Martin R Avatar answered Sep 19 '22 17:09

Martin R


Basically, from the ordinary arithmetic point view both neg and pos are identical zeros, therefore if pos == neg is true.

However, when it comes to representing a floating-point number, CGFloat has sign property as FloatingPointSign enum:

minus if the sign bit of self is set, and plus otherwise. Implements the IEEE 754 sign bit operation.

Therefore, your if-statement would be:

if neg.sign == pos.sign { } // false
like image 26
Ahmad F Avatar answered Sep 22 '22 17:09

Ahmad F