Автор Тема: Умный калькулятор  (Прочитано 12975 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Умный калькулятор
« : Октябрь 09, 2012, 04:02:39 am »
Всегда удивлялся виндозному калькулятору.

вычислим:
10 / 3 = 3,333333333333333

Что будет если умножить на 3 результат?
Каждый кодер знает что 9,999999999999999

Но этот засранец запоминает рациональные числа и выдает 10

К тому же он помнит не только последнее рациональное число, а на всю глубину вычислений.
Т.е. к числу 10 всегда можно вернуться выполняя обратные действия.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Умный калькулятор
« Ответ #1 : Октябрь 09, 2012, 04:29:53 am »
Всегда удивлялся виндозному калькулятору.

вычислим:
10 / 3 = 3,333333333333333

Что будет если умножить на 3 результат?
Каждый кодер знает что 9,999999999999999

Угу. А каждый программист знает что это не так :-) (и этим отличается программист от кодера)
$ cat float.cpp
#include <stdio.h>

int main() {
float foo;
float boo;
scanf("%f %f", &foo, &boo);
foo = foo/boo;
scanf("%f", &boo);
foo = foo*boo;
printf ("%f\n", foo);
return 0;
}
$ g++ float.cpp
$ ./a.out
10 3 3
10.000000
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Умный калькулятор
« Ответ #2 : Октябрь 09, 2012, 04:47:32 am »
Фу ты чорт я уже и подзабыл как тип Real устроен  :)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Умный калькулятор
« Ответ #3 : Октябрь 09, 2012, 05:33:14 am »
Н да... В Real точность только на иррациональных числах теряется (в калькуляторе аналогично)
Мне почему-то казалось что в бесконечных дробях тоже...
Давно я на нормальных языках не кодил однако  :)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Умный калькулятор
« Ответ #4 : Октябрь 09, 2012, 05:37:11 am »
Hugs> 10/3
3.33333333333333
Hugs> 3.33333333333333*3
9.99999999999999

о_О

Однако

Hugs> let x=10/3 in 3*x
10.0
« Последнее редактирование: Октябрь 09, 2012, 05:39:07 am от Geniepro »
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Умный калькулятор
« Ответ #5 : Октябрь 09, 2012, 05:38:05 am »
Н да... В Real точность только на иррациональных числах теряется (в калькуляторе аналогично)
Мне почему-то казалось что в бесконечных дробях тоже...
Давно я на нормальных языках не кодил однако  :)
Ключ к пониманию механизма лежит в ответе на вопрос: "что такое бесконечные дроби для IEEE 754?"
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Умный калькулятор
« Ответ #6 : Октябрь 09, 2012, 05:38:36 am »
Hugs> 10/3
3.33333333333333
Hugs> 3.33333333333333*3
9.99999999999999

о_О
Выкинь свой haskell.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Умный калькулятор
« Ответ #7 : Октябрь 09, 2012, 05:40:58 am »
Однако

Hugs> let x=10/3 in 3*x
10.0
Работать с литералами не интересно - оно их может оптимизировать на лету. Работать надо с тем, о чем компилятор не знает, то есть с вводимыми числами пользователем.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Умный калькулятор
« Ответ #8 : Октябрь 09, 2012, 05:45:05 am »
Hugs> 10/3
3.33333333333333
Hugs> 3.33333333333333*3
9.99999999999999
Ой, сори. Выкинуть тебе следует не haskell, а мозг: ты же потерял точность ручками скопировав текстовое обрезанное представление. 3.33333333333333 не равно тому числу что находится в памяти компьютера когда он делит 10/3.

> 3.33333333333333 == 10/3
=> False
« Последнее редактирование: Октябрь 09, 2012, 05:47:41 am от valexey_u »
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Умный калькулятор
« Ответ #9 : Октябрь 09, 2012, 05:58:18 am »
Однако в виндозном калькуляторе:
1/3 + 4/3 - 5/3 = 0
а в черной каропке:
1/3 + 4/3 - 5/3 = -2.220446049250313E-160.0000000000  ???

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Умный калькулятор
« Ответ #10 : Октябрь 09, 2012, 06:04:04 am »
Пардон, лишнее скопировал. Там так:
1/3 + 4/3 - 5/3 = -2.220446049250313E-16

Похоже что точность 10/3 - это просто неудачный пример
« Последнее редактирование: Октябрь 09, 2012, 06:06:17 am от ilovb »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Умный калькулятор
« Ответ #11 : Октябрь 09, 2012, 06:19:18 am »
Однако в виндозном калькуляторе:
1/3 + 4/3 - 5/3 = 0
а в черной каропке:
1/3 + 4/3 - 5/3 = -2.220446049250313E-160.0000000000  ???
У виндовозного калькулятора точность выше (то есть там не 64битные числа).
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Умный калькулятор
« Ответ #12 : Октябрь 09, 2012, 06:21:13 am »
Пардон, лишнее скопировал. Там так:
1/3 + 4/3 - 5/3 = -2.220446049250313E-16

Похоже что точность 10/3 - это просто неудачный пример

Hugs> 1/3 + 4/3 - 5/3
-2.22044604925031e-016
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Умный калькулятор
« Ответ #13 : Октябрь 09, 2012, 06:28:58 am »
Пардон, лишнее скопировал. Там так:
1/3 + 4/3 - 5/3 = -2.220446049250313E-16

Похоже что точность 10/3 - это просто неудачный пример

Hugs> 1/3 + 4/3 - 5/3
-2.22044604925031e-016
Сколько знаков после запятой в маздайном калькуляторе? Если 15ть, то:
$ cat float.cpp
#include <stdio.h>

int main() {
double a,b,c;
scanf("%lf %lf %lf",&a,&b,&c);
a = a/3;
b = b/3;
c = c/3;
printf ("%1.15lf\n", a+b-c);
return 0;
}

$ ./a.out
1 4 5
-0.000000000000000
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Умный калькулятор
« Ответ #14 : Октябрь 09, 2012, 06:29:50 am »
Пардон, лишнее скопировал. Там так:
1/3 + 4/3 - 5/3 = -2.220446049250313E-16

Похоже что точность 10/3 - это просто неудачный пример
Ключевой вопрос - почему это неудачный пример? ;-)
Y = λf.(λx.f (x x)) (λx.f (x x))