Unreal Features of Real Types, ΠΈΠ»ΠΈ Π‘ΡƒΠ΄ΡŒΡ‚Π΅ остороТны с REAL

ПослС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΎΠ± особСнностях Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ Π² PostgreSQL, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΆΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π±Ρ‹Π» ΠΏΡ€ΠΎ слоТности Ρ€Π°Π±ΠΎΡ‚Ρ‹ с вСщСствСнными числами. Π― Ρ€Π΅ΡˆΠΈΠ» Π±Π΅Π³Π»ΠΎ ΠΏΡ€ΠΎΠ±Π΅ΠΆΠ°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ доступных ΠΌΠ½Π΅ SQL-запросов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, насколько часто Π² Π½ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΈΠΏ REAL. Достаточно часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠ°ΠΊ оказалось, ΠΈ Π½Π΅ всСгда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ опасности, стоящиС Π·Π° Π½ΠΈΠΌ. И это нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ ΠΈ Π½Π° Π₯Π°Π±Ρ€Π΅ достаточно ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… статСй ΠΏΡ€ΠΎ особСнности хранСния вСщСствСнных чисСл Π² машинной памяти ΠΈ ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π½ΠΈΠΌΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ особСнности ΠΊ PostgreSQL, ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΡŽ Β«Π½Π° ΠΏΠ°Π»ΡŒΡ†Π°Ρ…Β» Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ связанныС с Π½ΠΈΠΌΠΈ нСприятности, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ SQL-запросов Π±Ρ‹Π»ΠΎ Π»Π΅Π³Ρ‡Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΈΡ….

ДокумСнтация PostgreSQL содСрТит Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΡƒΡŽ Ρ„Ρ€Π°Π·Ρƒ: Β«Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ ошибками ΠΈ ΠΈΡ… распространСниС Π² процСссС вычислСний являСтся ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠΌ изучСния Ρ†Π΅Π»ΠΎΠ³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ Π½Π°ΡƒΠΊΠΈ, ΠΈ здСсь Π½Π΅ рассматриваСтся» (ΠΏΡ€ΠΈ этом Π±Π»Π°Π³ΠΎΡ€Π°Π·ΡƒΠΌΠ½ΠΎ отсылая читатСля ΠΊ стандарту IEEE 754). Π§Ρ‚ΠΎ Π·Π° ошибки здСсь ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Ρƒ? Π”Π°Π²Π°ΠΉΡ‚Π΅ обсудим ΠΈΡ… ΠΏΠΎ-порядку, ΠΈ скоро станСт понятно, ΠΏΠΎΡ‡Π΅ΠΌΡƒ я снова взялся Π·Π° ΠΏΠ΅Ρ€ΠΎ.

Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, простой запрос:

********* Π—ΠΠŸΠ ΠžΠ‘ *********
SELECT 0.1::REAL;
**************************
float4
--------
    0.1
(1 строка)

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного – ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ 0.1. Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ сравним Π΅Π³ΠΎ с 0.1:

********* Π—ΠΠŸΠ ΠžΠ‘ *********
SELECT 0.1::REAL = 0.1;
**************************
?column?
----------
f
(1 строка)

НС Ρ€Π°Π²Π½Ρ‹! Π§Ρ‚ΠΎ Π·Π° чудСса! Но дальшС-большС. ΠšΡ‚ΠΎ-Ρ‚ΠΎ скаТСт, ΠΌΠΎΠ», я знаю, Ρ‡Ρ‚ΠΎ REAL ΠΏΠ»ΠΎΡ…ΠΎ Π²Π΅Π΄Π΅Ρ‚ сСбя с дробями, Π½Ρƒ Ρ‚Π°ΠΊ я Π±ΡƒΠ΄Ρƒ Ρ‚ΡƒΠ΄Π° Π·Π°Π½ΠΎΡΠΈΡ‚ΡŒ Ρ†Π΅Π»Ρ‹Π΅ числа, с Π½ΠΈΠΌΠΈ-Ρ‚ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ всС Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Ок, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ число 123 456 789 ΠΊ Ρ‚ΠΈΠΏΡƒ REAL:

********* Π—ΠΠŸΠ ΠžΠ‘ *********
SELECT 123456789::REAL::INT;
**************************
   int4   
-----------
123456792
(1 строка)

А ΠΎΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ большС Π½Π° 3! ВсС, Π±Π°Π·Π° ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ! Или ΠΌΡ‹ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ Π½Π΅Π΄ΠΎΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ? Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ.

Для Π½Π°Ρ‡Π°Π»Π° вспомним ΠΌΠ°Ρ‚Ρ‡Π°ΡΡ‚ΡŒ. Как извСстно, любоС дСсятичноС число ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΏΠΎ стСпСням дСсяти. Π’Π°ΠΊ, число 123.456 Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ 1*102 + 2*101 + 3*100 + 4*10-1 + 5*10-2 + 6*10-3. Но ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ числами Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… приходится Π² Π²ΠΈΠ΄Π΅ разлоТСния ΠΏΠΎ стСпСням Π΄Π²ΠΎΠΉΠΊΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ число 5.625 Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ прСдставляСтся ΠΊΠ°ΠΊ 101.101 ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ 1*22 + 0*21 + 1*20 + 1*2-1 + 0*2-2 + 1*2-3. И Ссли ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ стСпСни Π΄Π²ΠΎΠΉΠΊΠΈ всСгда Π΄Π°ΡŽΡ‚ Ρ†Π΅Π»Ρ‹Π΅ дСсятичныС числа (1, 2, 4, 8, 16 ΠΈ Ρ‚.Π΄.), Ρ‚ΠΎ с ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ всС слоТнСС (0.5, 0.25, 0.125, 0,0625 ΠΈ Ρ‚.Π΄.). ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π²ΡΡΠΊΡƒΡŽ Π΄Π΅ΡΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ Π΄Ρ€ΠΎΠ±ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ Π΄Ρ€ΠΎΠ±ΠΈ. Π’Π°ΠΊ, нашС прСсловутоС 0.1 Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ Π΄Ρ€ΠΎΠ±ΠΈ прСдстаСт ΠΊΠ°ΠΊ пСриодичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.0(0011). Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого числа Π² машинной памяти Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ разрядности.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ самоС врСмя Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ вСщСствСнныС числа хранятся Π² памяти ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Говоря Π² ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ…, вСщСствСнноС число состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… основных частСй – Π·Π½Π°ΠΊΠ°, мантиссы ΠΈ экспонСнты. Π—Π½Π°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ плюс, Π»ΠΈΠ±ΠΎ минус, поэтому Π½Π° Π½Π΅Π³ΠΎ отводится ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ‚. А Π²ΠΎΡ‚ количСство Π±ΠΈΡ‚ мантиссы ΠΈ экспонСнты опрСдСляСтся вСщСствСнным Ρ‚ΠΈΠΏΠΎΠΌ. Π’Π°ΠΊ, для Ρ‚ΠΈΠΏΠ° REAL Π΄Π»ΠΈΠ½Π° мантиссы составляСт 23 Π±ΠΈΡ‚ (ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ‚, Ρ€Π°Π²Π½Ρ‹ΠΉ 1, нСявно добавляСтся Π² Π½Π°Ρ‡Π°Π»ΠΎ мантиссы, ΠΈ получаСтся 24), Π° экспонСнты – 8 Π±ΠΈΡ‚. Π˜Ρ‚ΠΎΠ³ΠΎ получаСтся 32 Π±ΠΈΡ‚, ΠΈΠ»ΠΈ 4 Π±Π°ΠΉΡ‚Π°. А для Ρ‚ΠΈΠΏΠ° DOUBLE PRECISION Π΄Π»ΠΈΠ½Π° мантиссы Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΆΠ΅ 52 Π±ΠΈΡ‚, ΠΈ экспонСнты – 11 Π±ΠΈΡ‚, Π² суммС ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… 64 Π±ΠΈΡ‚, ΠΈΠ»ΠΈ 8 Π±Π°ΠΉΡ‚. Π‘ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ PostgreSQL для чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΡƒΠΏΠ°ΠΊΡƒΠ΅ΠΌ нашС число 0.1 Π² дСсятичном Π²ΠΈΠ΄Π΅ Π² ΠΎΠ±Π° Ρ‚ΠΈΠΏΠ° – REAL ΠΈ DOUBLE PRECISION. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°ΠΊ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ экспонСнты Ρƒ нас совпадаСт, сосрСдоточимся Π½Π° мантиссС (я ΡΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡƒΡΠΊΠ°ΡŽ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ особСнности хранСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ экспонСнты ΠΈ Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… вСщСствСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΡƒΡ‚ΡΠΆΠ΅Π»ΡΡŽΡ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ ΠΎΡ‚ сути ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Ссли интСрСсно – смотритС стандарт IEEE 754). Π§Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ? Π’ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ строчкС я ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ «мантиссу» для Ρ‚ΠΈΠΏΠ° REAL (с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ округлСния послСднСго Π±ΠΈΡ‚Π° Π² 1 Π΄ΠΎ блиТайшСго прСдставимого числа, ΠΈΠ½Π°Ρ‡Π΅ получится 0.099999…), Π° Π² Π½ΠΈΠΆΠ½Π΅ΠΉ – для Ρ‚ΠΈΠΏΠ° DOUBLE PRECISION:

0.000110011001100110011001101
0.00011001100110011001100110011001100110011001100110011001

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ это Π΄Π²Π° ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… числа! ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ сравнСнии ΠΏΠ΅Ρ€Π²ΠΎΠ΅ число Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΎ нулями ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ большС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ (с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ округлСния – ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΉ ΠΆΠΈΡ€Π½Ρ‹ΠΌ Π΅Π΄ΠΈΠ½ΠΈΡ‡ΠΊΠΈ). Π­Ρ‚ΠΈΠΌ ΠΈ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈΠ· Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ явно ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ число 0.1 приводится ΠΊ Ρ‚ΠΈΠΏΡƒ DOUBLE PRECISION, послС Ρ‡Π΅Π³ΠΎ сравниваСтся с числом Ρ‚ΠΈΠΏΠ° REAL. Оба приводятся ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ, ΠΈ ΠΈΠΌΠ΅Π΅ΠΌ Ρ€ΠΎΠ²Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²ΠΈΠ΄ΠΈΠΌ Π²Ρ‹ΡˆΠ΅. Π’ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ запрос, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС встало Π½Π° свои мСста:

********* Π—ΠΠŸΠ ΠžΠ‘ *********
SELECT 0.1::REAL > 0.1::DOUBLE PRECISION;
**************************
?column?
----------
t
(1 строка)

И Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ числа 0.1 ΠΊ REAL ΠΈ DOUBLE PRECISION ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° Π·Π°Π³Π°Π΄ΠΊΡƒ:

********* Π—ΠΠŸΠ ΠžΠ‘ *********
SELECT 0.1::REAL::DOUBLE PRECISION;
**************************

      float8       
-------------------
0.100000001490116
(1 строка)

Π­Ρ‚ΠΈΠΌ ΠΆΠ΅ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅. Число 123 456 789 просто Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² 24 Π±ΠΈΡ‚Π° мантиссы (23 явных + 1 ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅ΠΌΡ‹ΠΉ). МаксимальноС Ρ†Π΅Π»ΠΎΠ΅ число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² 24 Π±ΠΈΡ‚Π°, Π±ΡƒΠ΄Π΅Ρ‚ 224-1 = 16 777 215. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ нашС число 123 456 789 округляСтся Π΄ΠΎ блиТайшСго прСдставимого 123 456 792. Π‘ΠΌΠ΅Π½ΠΈΠ² Ρ‚ΠΈΠΏ Π½Π° DOUBLE PRECISION, ΠΌΡ‹ ΡƒΠΆΠ΅ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Ρ‚Π°ΠΊΠΎΠ³ΠΎ сцСнария:

********* Π—ΠΠŸΠ ΠžΠ‘ *********
SELECT 123456789::DOUBLE PRECISION::INT;
**************************
   int4   
-----------
123456789
(1 строка)

Π’ΠΎΡ‚ ΠΈ всС. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… чудСс. Но всС описанноС – Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΠΎΠ²ΠΎΠ΄ ΠΏΡ€ΠΈΠ·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Ρ‚ΠΎΠ³ΠΎ, насколько Π²Π°ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΈΠΏ REAL. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, самый большой плюс Π΅Π³ΠΎ использования – быстрота вычислСний с Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉΡΡ ΠΏΠΎΡ‚Π΅Ρ€Π΅ΠΉ точности. Но Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ это ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ сцСнариСм, ΠΎΠΏΡ€Π°Π²Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ ΡΡ‚ΠΎΠ»ΡŒ частоС использованиС этого Ρ‚ΠΈΠΏΠ°? НС Π΄ΡƒΠΌΠ°ΡŽ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com