
Le lundi 25 février 2008 à 22:08 +0100, Johan Råde a écrit :
I am missing the point of the changesign function. What is its rationale? The documentation talks about copysign(x, signbit(x) ? 1 : -1) but not about -x. So I am a bit lost.
Is -x guaranteed to change the sign of zero and NaN? If it is, then I agree that the function is superfluous.
Back to the topic at hand, I don't know of any architecture/compiler where negating a number does not flip the sign bit of the number, so -x works both for zero and NaN.
I just found out that for the ia32 architecture, unary minus flips the signbit of NaN if you use the x87 units, but not if you use the SSE units. So the changesign function is useful.
Sorry to disappoint you, but you probably have not found anything but a compiler optimization. As I explained in a previous mail, the sign bit is not part of the NaN payload. So a standard-compliant compiler is allowed to replace -NaN(17) by NaN(17) in the code. If you put a "volatile" between the NaN and the negation, you will probably get your sign back. It doesn't have anything to do with the arithmetic units. As a matter of fact, the SSE units do not provide any "negate" opcode, so compilers generate a "xor" opcode instead. You will have a hard time convincing anybody that the xor instruction is failing to flip the sign bit. So I suggest you take a look at the assembly output of your compiler and check what the generated code actually look like. Best regards, Guillaume