Следните математически примери ще бъдат главни герои на деня. Условно ги групирам по двойки.
0.5 - 0.4 = 0.1
0.3 - 0.2 = 0.1
0.2 - 0.1 = 0.1
Разлика на десетични дроби с един и същи резултат - 0.1, а като цяло подобни операции са много удобни за човешкото възприятие при финансови разчети. Нека извършим същите разчети в три програмни езика. Нещата се свеждат до присвояване резултата от всеки математически израз на съответна променлива, след което сравняваме променливите на равенство помежду им. Наша цел е какъв отговор получаваме.
Апроксимация в (My)SQL
Пример 1
set @a = 0.6-0.5, @b = 0.5-0.4; SELECT @a AS a, @b AS b; SELECT IF(@a=@b,'TRUE','FALSE') AS result;резултат
Пример 2
set @a = 0.3-0.2, @b = 0.2-0.1; SELECT @a AS a, @b AS b; SELECT IF(@a=@b,'TRUE','FALSE') AS result;резултат
И в двата случая MySQL върна TRUE. Както се казва - честито, булката е честна!
Апроксимация в PHP
Я да види дядо поп има ли в гърнето боб?Пример 1
<?php $a = 0.6-0.5; $b = 0.5-0.4; //echo "\$a = $a \$b = $b"; var_dump($a===$b);резултат
Добре, много добре ... отлично!
Пример 2
<?php $a = 0.3-0.2; $b = 0.2-0.1; //echo "\$a = $a \$b = $b"; var_dump($a===$b);резултат
А, шах с пешката! Що така бе Миме?
Апроксимация в JavaScript
Как стоят нещата в този език?Пример 1
<script type="text/javascript"> var a; a = 0.6-0.5; var b; b = 0.5-0.4; (a===b)? document.write("TRUE") : document.write("FALSE") </script>резултат
ОК, всичко е под контрол ...
Пример 2
<script type="text/javascript"> var a; a = 0.3-0.2; var b; b = 0.2-0.1; (a===b)? document.write("TRUE") : document.write("FALSE") </script>резултат
Бля! К'во става тука!?
Епилог
Апроксимация произхожда от латинската дума "approximo" и се превежда като приближение. В математиката означава замяна на сложни обекти с по-прости или с по-сходни към изходните. В примерите използвах естествени числа, чието представление разглежда стандарт IEEE-754, определящ двоичния им формат. За съжаление, формата на двоичното представление на реалните числа е ограничен, което позволява точно да изрази ограничено количество. Следва да се очаква, че представлението за останалите ще се явява някакво закръгление и ще породи проблеми подобни на резултат FALSE, където заради погрешност при окръгляване разликата между числа 0.3 и 0.2 не е равна на разликата между числа 0.2 и 0.1. И няма промяна ако оператор еквивалентност/идентичност (===) се промени на оператор равенство (==). По-важно е да се разбере, че този проблем не е нещо характерно за PHP или JavaScript, споделят го и други езици. Точността на окръгляване е напълно приемлива за голям брой случаи, но следва да се има едно на ум при опити за проверка на значенията на равенство.до нови срещи ^.^
0 Response to "Апроксимация в уеб-програмирането"
Публикуване на коментар