Форум OlegON > Разговоры на отвлеченные темы > Беседка > Интересное

Программистам! Различные загадки - проблемы : Интересное

28.03.2024 22:47


12.02.2017 09:49
AndreyZh
 
Заведу темку? Здесь вроде бы и программисты тусуются?

Вчера "подняли" мою тему на специализированном форуме с очередной арифметической "загадкой", которую транслирую на OlegON

а = 33724.30
b = 6120.30
c = a + b

Чему равняется "с"? В "жизни" = 39844.60, а на ЯП?

На языке [x]Harbour - не подглядывайте!:

set fixed on
SET DECIMALS TO 15
? 33724.30+6120.30

Результат: 39844.600000000010000



На языке Visual FoxPro 9 - не подглядывайте!:




Однако большинство ЯП, серьёзных приложений, программ управления оборудованием - короче все для вычислительных устройств написано на C++... Что ответит данный код?

Код:
#include <stdio.h> 
int main () 
 { 
    double a = 33724.30; 
    double b = 6120.30; 
  
    printf( "result = %.15f\n", a + b ); 
  
    return( 0 ); 
 }
Компилятор BCC 5.5 - не моё:

result = 39844.600000000005820



Компилятор PellesC 8.0 - не моё:

result = 39844.600000000005821


Задумался... Почему же так редко взрываются атомные станции?
12.02.2017 10:23
AndreyZh
 
Позвольте ещё одну "загадку"? Во всех ЯП есть функция Int - целая часть числа, т.е. просто отбрасывается дробная часть.

Чему равняется?

n = (3.14 ^ 3.14 ^ 3.14 ^ 3.14) / 0.33

n ?
Int(n) ?


и какое всё-таки правильное значение? Если будут версии и они будут различаться, то почему это происходит? Объяснение и отгадка имеется...

Правильный результат:

7345182531368845.00
7345182531368845
12.02.2017 10:24
OlegON
 
Цитата:
AndreyZh а на ЯП?
Oracle:

select round(33724.30+6120.30,15) from dual;

ROUND(33724.30+6120.30,15)
--------------------------
39844.6

SQL> select round(33724.30f+6120.30f,15) from dual;


ROUND(33724.30F+6120.30F,15)
----------------------------
39844.6016
12.02.2017 10:26
OlegON
 
MariaDB/MySQL:

MariaDB [(none)]> select round(33724.30+6120.30,15);
Код:
+----------------------------+
| round(33724.30+6120.30,15) |
+----------------------------+
|      39844.600000000000000 |
+----------------------------+
1 row in set (0.00 sec)
12.02.2017 11:00
student
 
Цитата:
AndreyZh Почему же так редко взрываются атомные станции?
а потому что никто там double\float не юзает...
у вещественных типов данных точность обеспечивается только до определённого знака
всё что пишется дальше - это приближенное значение, которому по большей части нельзя верить
в большинстве случаев два числа с типом Double не будут равны друг другу (хотя внешне, могут такими показаться)

все связано с неверной или не проводимой нормализацией чисел и преобразования типов

ms access - select round(33724.30+6120.30,15) - 39844.6

пы сы кстати именно поэтому в большинстве банковских систем все считается в копейках :)
Часовой пояс GMT +3, время: 22:47.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.