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

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

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

Студворк — интернет-сервис помощи студентам
Друзья! питон 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.10.2016, 17:41
Ответы с готовыми решениями:

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

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

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

10
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
05.10.2016, 14:38
Лучший ответ Сообщение было отмечено 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
07.10.2016, 14:20

Не по теме:

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

0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
07.10.2016, 17:16  [ТС]
Цитата Сообщение от 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
Числа с плавающей запятой хранятся в двоичном представлении, поэтому число 2.1 на самом деле может храниться как 2.100000000000000034, допустим. А 1.5 всегда 1.5, потому что 0.5 = 1/2
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
07.10.2016, 17:57  [ТС]
Цитата Сообщение от 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
Python
1
2
>>> Fraction ('3.2')
Fraction(16, 5)
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
07.10.2016, 20:45
Цитата Сообщение от 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
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
07.10.2016, 21:29  [ТС]
Цитата Сообщение от 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=100000 0)
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
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
08.10.2016, 21:26
Цитата Сообщение от 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
Цитата Сообщение от dondublon Посмотреть сообщение
Ибо с математической точностью в 8 байт можно засунуть только небольшую долю действительных чисел
Тут даже не в ограничении на разряды проблема, будть хоть 256 разрядов проблема будет та же - теоретически невозможно число 0.1 представить в двоичном представлении с основанием 2
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.10.2016, 07:37
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru