フェルマーの最終定理の「反例」(MySQL編)


MySQLでは、a=5999856E0, b=99992800E0, c=100000000E0としたときに、a^3 + b^3 = c^3になります。

SELECT
  5999856E0*5999856E0*5999856E0
 +99992800E0*99992800E0*99992800E0
 -100000000E0*100000000E0*100000000E0\G
*************************** 1. row ***************************
5999856E0*5999856E0*5999856E0
 +99992800E0*99992800E0*99992800E0
 -100000000E0*100000000E0*100000000E0: 0
1 row in set (0.00 sec)

多くのプログラミング言語と違うのは、5999856.0のように書くと結果が変わることです。

SELECT
  5999856.0*5999856.0*5999856.0
 +99992800.0*99992800.0*99992800.0
 -100000000.0*100000000.0*100000000.0\G
*************************** 1. row ***************************
5999856.0*5999856.0*5999856.0
 +99992800.0*99992800.0*99992800.0
 -100000000.0*100000000.0*100000000.0: -2985984.000
1 row in set (0.00 sec)

5999856と5999856E0、5999856.0は、

  • 算数や数学では、5999856=5999856E0=5999856.0(すべて同じ)、
  • 自然科学では、5999856=5999856E0≠5999856.0(有効数字の意味で)、
  • 多くのプログラミング言語では、5999856≠5999856E0=5999856.0(整数と浮動小数点数)。

多くのプログラミング言語と異なり、MySQLではすべて別物です。次のように確認できます。

CREATE TEMPORARY TABLE t
  SELECT 5999856 AS a,5999856E0 AS b,5999856.0 AS c;

DESCRIBE t;

+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a     | int(7)       | NO   |     | 0       |       |
| b     | double       | NO   |     | 0       |       |
| c     | decimal(8,1) | NO   |     | 0.0     |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

参考:精密計算の例

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です