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)来反驳勾股定理,根据标准,该0x7F800001不等于自身。