Why fprintf('%​3.1f',roun​d(-eps)) prints -0.0?

3 Ansichten (letzte 30 Tage)
Sandor Toth
Sandor Toth am 17 Jan. 2017
Kommentiert: James Tursa am 17 Jan. 2017
I found some very strange behaviour of the round function in Matlab R2016b (at least for me). I would expect that the round function returns 0 for -eps, but surprisingly the command:
num2hex(round(-eps))
Returns:
8000000000000000
Instead of
num2hex(0) == 0000000000000000
This causes fprintf() to print -0.0. Is this a bug or I just miss something?
  1 Kommentar
James Tursa
James Tursa am 17 Jan. 2017
Side Note: This seems to be consistent among the related functions ceil and fix as well. E.g.,
>> num2hex(round(-eps))
ans =
8000000000000000
>> num2hex(ceil(-eps))
ans =
8000000000000000
>> num2hex(fix(-eps))
ans =
8000000000000000

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Stephen23
Stephen23 am 17 Jan. 2017
Bearbeitet: Stephen23 am 17 Jan. 2017
You are missing the fact that MATLAB has two zeros: positive zero and negative zero, which have different HEX values. This is a result of the IEEE 754 floating point standard that MATLAB implements, which uses one bit to indicate the number sign: a corollary of this is that even a zero can be positive or negative.
It is not possible to use < to directly test if zero is negative (by definition negative zero is equal to positive zero, so this makes sense):
>> (-0)<0
ans =
0
but here is one simple trick that will test for negative zero:
>> (1/-0)<0
ans =
1
Which relies on this behavior:
>> 1/-0
ans =
-Inf
>> 1/round(-eps) % your question
ans =
-Inf
Neat huh!
You can find more interesting information on negative zeros here:

Weitere Antworten (1)

Adam
Adam am 17 Jan. 2017
Bearbeitet: Adam am 17 Jan. 2017

Produkte

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by