Невероятный math.pow

Jul 28, 2012 22:27


Задачка для младших инженеров-программистов электронно-вычислительных машин.

C:

#include #include int main() { printf("%d\n", (pow(43, 10) == 21611482313284249ll)); return 0; }

Python:

import math print(math.pow(43, 10) == 21611482313284249)

Вопрос: что выведется и почему?

нечеловеческие языки, задачка

Leave a comment

qkowlew July 29 2012, 06:21:55 UTC
Когда-то давным давно начальный этап обучения программированию непременно содержал описание битового представления чисел, ограничений арифметики "в цифре" и т.п.

А тут даже константу написать - надо как минимум лезть в мануал по каждому из языков.
И сравнивать плавающие операцией == - ну вааащщщщщще.

В моей личной практике была отладка кода, в котором накапливающаяся ошибка округления в тупо написанном алгоритме с double float давала в сочетании с вычитанием больших чисел эффект "0=1" на всего лишь сотне поступивших в программу результатов измерения.

Reply

_winnie July 29 2012, 06:53:15 UTC
> И сравнивать плавающие операцией == - ну вааащщщщщще.
Пишущие на JavaScript, AWK, Lua, ... только так и сравнивают :)

Сравнивать с точностью до MY_EPSION?.. Сорри, что бы сравнить 43**10 и math.pow(43, 10) EPSILON должен быть не меньше чем 1.0 :)

Reply

gegmopo4 July 29 2012, 07:19:48 UTC
ll уже я добавил, иначе на 32-битных платформах терялась соль шутки.

У этой истории есть и мораль - не используйте плавучку в криптографии.

Reply

slobin July 29 2012, 09:00:39 UTC
Что добавляет конфузии из-за типографской путаницы "l" и "1". Особенно если не помнить твёрдо о существовании констант long long (кстати, а они в стандарте есть? не помню...).

... Sing, Maglor the Stranger, a ballade for me ...

Reply

gegmopo4 July 29 2012, 10:36:19 UTC
Есть, но возможно факультативно. На (всех?) популярных платформах есть и не меньше 64 бит.

Reply


Leave a comment

Up