Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

Метод float.as_integer_ratio() возвращает числа, умноженные на неимоверно большие коэффициенты, ЗАЧЕМ?

04.10.2016, 17:41. Показов 5185. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья! питон 3.1.1

Python
1
2
>>> float.as_integer_ratio(2.1)
(4728779608739021, 2251799813685248)
Шутки какие-то несмешные.

+++++++++++++++++++++++++++++

(21, 10)- это правильный результат;
(42, 20)- тоже ничего
(84, 40)-похуже будет

А предлагаемый результат это изврат полный.

Зачем же питон умножает 21 и 10 на неимоверно большие коэффициенты (точнее на коэффициент 225179981368524,8 ещё и нецелый к тому же) и выдаёт получившийся результат? Вроде и так всё непросто, не пойму, зачем сложности на ровном месте создавать? Тем более, что здесь чётко сказано:

Return a pair of integers whose ratio is exactly equal to the original float and with a positive denominator. Raises OverflowError on infinities and a ValueError on NaNs.
Вот, кстати, пример нормального человеческого вывода:

Python
1
2
>>> float.as_integer_ratio(1.5)
(3, 2)
В общем, спасибо, кто откликнется.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2016, 17:41
Ответы с готовыми решениями:

Почему функция возвращает большие числа?
Почему функция возвращает большие числа ? type TPInt=^Integer; TForm1 = class(TForm) ...

Метод наименьших квадратов. Получаются очень большие числа
Помогите, пожалуйста! Есть система уравнений P*x=z. Размеры: P (n,6), x(6), z(n). Получается 6...

Разработать метод, который возвращает количество делителей заданного числа х
Разработать метод kolDel(x: Integer), который возвращает количество делителей заданного числа х....

Разработать метод f (x), который возвращает младшую цифру натурального числа x
Помогите пожалуйста с задачками. Составить программы №1.Разработать метод f(x) , который...

10
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
05.10.2016, 14:38 2
Лучший ответ Сообщение было отмечено dondublon как решение

Решение

Видимо, алгоритм такой. В описании не сказано, что коэффициенты будут наименьшими

Добавлено через 24 минуты
C просторов stackoverflow:
Python
1
2
3
4
5
>>> from fractions import Fraction
>>> Fraction(3.2)
Fraction(3602879701896397, 1125899906842624)
>>> Fraction(3.2).limit_denominator()
Fraction(16, 5)
0
dondublon
07.10.2016, 14:20
  #3

Не по теме:

Иэхх. Сам себя не похвалишь - никто не похвалит.

0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
07.10.2016, 17:16  [ТС] 4
Цитата Сообщение от dondublon Посмотреть сообщение
Python
1
2
3
>>> from fractions import Fraction 
>>> Fraction(3.2) 
Fraction(3602879701896397, 1125899906842624)
а у вас какая версия питона? У меня другой результат выдаёт.
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
07.10.2016, 17:53 5
Числа с плавающей запятой хранятся в двоичном представлении, поэтому число 2.1 на самом деле может храниться как 2.100000000000000034, допустим. А 1.5 всегда 1.5, потому что 0.5 = 1/2
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
07.10.2016, 17:57  [ТС] 6
Цитата Сообщение от kravam Посмотреть сообщение
а у вас какая версия питона? У меня другой результат выдаёт.
извините, сразу не написал у меня такой результат:

Python
1
2
3
4
5
6
7
8
>>> from fractions import Fraction
>>> Fraction (3.2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "E:\Python31\lib\fractions.py", line 100, in __new__
    raise TypeError("argument should be a string "
TypeError: argument should be a string or a Rational instance
>>>
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
07.10.2016, 18:19 7
Python
1
2
>>> Fraction ('3.2')
Fraction(16, 5)
0
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
07.10.2016, 20:45 8
Цитата Сообщение от kravam Посмотреть сообщение
а у вас какая версия питона? У меня другой результат выдаёт.
У меня 3.4. Но по числу 2.1 результат соответствует.

Цитата Сообщение от oldnewyear Посмотреть сообщение
Числа с плавающей запятой хранятся в двоичном представлении, поэтому число 2.1 на самом деле может храниться как 2.100000000000000034, допустим. А 1.5 всегда 1.5, потому что 0.5 = 1/2
Да, это тоже вносит свой вклад.

Цитата Сообщение от kravam Посмотреть сообщение
TypeError: argument should be a string or a Rational instance
>>>
Хз, у меня работает.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
07.10.2016, 21:29  [ТС] 9
Цитата Сообщение от dondublon Посмотреть сообщение
У меня 3.4. Но по числу 2.1 результат соответствует.
Ну я уж не буду ставить себе 3.4, но к документации по 3.4 всё же обращусь

class fractions.Fraction(numerator=0, denominator=1)
class fractions.Fraction(other_fraction)
class fractions.Fraction(float)
class fractions.Fraction(decimal)
class fractions.Fraction(string)
У вас всё OK, как вы и писали. А у меня:

class fractions.Fraction(numerator=0, denominator=1)
class fractions.Fraction(other_fraction)
class fractions.Fraction(string)
Так что я был бы вам благодарен, если бы вы более внимательнее относились к версии питона собеседника. Если я говорю, что оно не работает, значит, оно не работает. Хотя я могу ошибаться, да.

+++++++++++++++++++++++++++++++++++++++

В общем-то, использование limit_denominator всё решает, но вот перевод меня обескураживает. Во-первых, эффект:

Windows Batch file
1
2
>>> Fraction.from_float(2.1).limit_denominator()
Fraction(21, 10)
, то, что нужно, да. А теперь перевод:

" limit_denominator(max_denominator=1000000)
Finds and returns the closest Fraction to self that has denominator at most max_denominator."
Находит и возвращает ближайшую дробь к самой себе (к 21/10), которая имеет знаменатель, "at most 1000000"

С каких пор "at most 1000000" стало означать "как можно меньший"- вот вопрос!
0
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
08.10.2016, 21:26 10
Цитата Сообщение от kravam Посмотреть сообщение
Находит и возвращает ближайшую дробь к самой себе (к 21/10), которая имеет знаменатель, "at most 1000000"
С каких пор "at most 1000000" стало означать "как можно меньший"- вот вопрос!
Думаю, для ваших целей этого достаточно. Ибо с математической точностью в 8 байт можно засунуть только небольшую долю действительных чисел, как справедливо заметил oldnewyear. Даже если речь о конечных, десятичной записи, дробях.
Я и так в восхищении, что какие-то добрые люди реализовали такой, в общем-то, весьма нетривиальный алгоритм.
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
09.10.2016, 07:37 11
Цитата Сообщение от dondublon Посмотреть сообщение
Ибо с математической точностью в 8 байт можно засунуть только небольшую долю действительных чисел
Тут даже не в ограничении на разряды проблема, будть хоть 256 разрядов проблема будет та же - теоретически невозможно число 0.1 представить в двоичном представлении с основанием 2
0
09.10.2016, 07:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2016, 07:37
Помогаю со студенческими работами здесь

Разработать метод f (x), который возвращает младшую цифру натурального числа
Помогите составить программу. Разработать метод f(x), который возвращает младшую цифру...

Разработать метод f (x), который возвращает младшую цифру натурального числа x
Помогите пожалуйста с задачками. Составить программы Разработать метод f(x) , который возвращает...

Разработать метод, который возвращает младшую цифру натурального числа
Доброго времени суток, собственно проблема в описании метода, я не могу понять, как его описать....

Разработать метод, который возвращает младшую цифру натурального числа x
Всем привет! нужен код программы в С#. Задача:Разработать метод f(x), который возвращает младшую...

Разработать метод, который возвращает вторую справа цифру натурального числа
Разработать метод , который возвращает вторую справа цифру натурального числа . Вычислить с помощью...

Разработать метод f(x), который возвращает вторую справа цифру натурального числа x
Разработать метод f(x), который возвращает вторую справа цифру натурального числа x. Вычислить с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru