C
私たちはすべて整数オーバーフローを嫌うので、小さな指数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)を使用してピタゴラスの定理を反証することです。