Форум программистов, компьютерный форум, киберфорум
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. Показов 5626. Ответов 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru