標準によれば、負のゼロは存在しますが、正のゼロと同じです。ほとんどすべての目的で、この 2 つは同じように動作し、多くの場合、ネガの存在は実装の詳細であると考えられています。ただし、まったく異なる動作をする関数がいくつかあります。つまり、除算とatan2
です。
#include <math.h>
#include <stdio.h>
int main() {
double x = 0.0;
double y = -0.0;
printf("%.08f == %.08f: %d\n", x, y, x == y);
printf("%.08f == %.08f: %d\n", 1 / x, 1 / y, 1 / x == 1 / y);
printf("%.08f == %.08f: %d\n", atan2(x, y), atan2(y, y), atan2(x, y) == atan2(y, y));
}
このコードの結果は次のとおりです。
0.00000000 == -0.00000000: 1
1.#INF0000 == -1.#INF0000: 0
3.14159265 == -3.14159265: 0
これは、コードが明示的な処理を必要とせずに特定の制限を正しく処理することを意味します。単純な計算エラーが符号を変更し、値が正しくない可能性があるため、制限に近い値に対してこの機能に依存することが良い考えであるかどうかは定かではありませんが、記号を変更します。