씨
우리는 모두 정수 오버플로를 싫어하므로 작은 지수 n
와 일부 부동 소수점 변환을 사용합니다. 그러나 여전히 정리는지지하지 않을 것이다 a = b = c = 2139095040
.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int a, b, c;
int n;
int disprove(int a, int b, int c, int n)
{
// Integers are so prone to overflow, so we'll reinforce them with this innocent typecast.
float safe_a = *((float *)&a);
float safe_b = *((float *)&b);
float safe_c = *((float *)&c);
return pow(safe_a, n) + pow(safe_b, n) == pow(safe_c, n);
}
int main(void)
{
srand(time(NULL));
a = b = c = 2139095040;
n = rand() % 100 + 3;
printf("Disproved for %d, %d, %d, %d: %s\n", a, b, c, n, disprove(a, b, c, n) ? "yes" : "no");
}
산출:
Disproved for 2139095040, 2139095040, 2139095040, 42: yes
Disproved for 2139095040, 2139095040, 2139095040, 90: yes
IEEE 754에서 숫자 2139095040 또는 0x7F800000은 단 정밀도 부동 소수점 유형에서 양의 무한대를 나타냅니다. 모든 pow(...)
호출은 + Infinity를 반환하고 + Infinity는 + Infinity와 같습니다. 더 쉬운 작업은 표준에 따라 같지 않은 0x7F800001 (Quiet NaN)을 사용하여 피타고라스 정리를 반증하는 것입니다.