Latest posts on как избавится от экспоненты в переменной Decimal topichttp://python.su/forum/topic/37485/2019-07-20T23:13:17+03:00Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-20T23:13:17+03:00doza_and203049<a href="https://www.sympy.org/ru/">https://www.sympy.org/ru/</a><br/>
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-20T21:43:49+03:00@cckyi_boxxx203047<strong>doza_and</strong>, а не будет-ли наглостью попросить вас кинуться в меня литературой или кратким мануалом по по реализации “системы компьютерной алгебры” на python?
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-20T20:45:52+03:00doza_and203046<blockquote><em>@cckyi_boxxx</em><br/>вопрос в том удобнее-ли и надежнее</blockquote>Не удобнее и не надежнее. Фортран вообще отживший язык. Если нужна абсолютная точность то используйте системы кмпьютерной алгебры.
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-20T18:30:24+03:00@cckyi_boxxx203044Всем спасибо за ответы!<br/><br/><blockquote><em>doza_and</em><br/>И в базовом питоне и в numpy нет типа “десятичные дроби” (я такой тип вообще ни в одном языке не встречал).</blockquote>сорян, неправильно выразился я говорил именно про float , и я понимаю что с этим типом точных вычислений не жди, но когда читал книгу “Python и анализ данных” автор Уэс Маккинни, точно помню что он описывал ситуацию при которой питоновский float при выдавал 0.1 + 0.2 = 0.3000000000000001 (точно не помню выражение но суть понятна, при этом numpy работал четко , говоря о точности я именно это имел ввиду.<br/><br/><strong>JOHN_16</strong>, настолько глубоко я еще не изучал этот вопрос, но спасибо за ссыль, прочел, теперь есть представление что к чему.<br/><br/><strong>Rodegast</strong>, очередной раз спасибо за подсказку, я не знал о существовании Fraction, выделю время и с удовольствием его поковыряю, если окажется что он лучше взаимодействует со стандартными типами python, и при этом точность вычислений достаточна то скорее всего заменю им Decimal.<br/><br/>И есть еще один интересный момент, в какой-то литературе читал что к из питонокода можно юзать фортран, сейчас вопрос даже не о том как это делать, с этим при необходимости разберусь сам, вопрос в том удобнее-ли и надежнее-ли он для точных вычислений чем то что есть под питон?
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-19T11:11:16+03:00Rodegast203025> в базовом питоне и в numpy нет типа “десятичные дроби” (я такой тип вообще ни в одном языке не встречал).<br/>>> Есть такой тип<br/><br/>Это тип не десятичной, а простой дроби. В Python-е он тоже есть, называется Fraction.
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-19T10:30:22+03:00FishHook203024<blockquote><em>doza_and</em><br/>я такой тип вообще ни в одном языке не встречал</blockquote>Есть <a href="https://wiki.haskell.org/Rational">такой тип</a>
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-19T09:44:25+03:00doza_and203023<blockquote><em>@cckyi_boxxx</em><br/>уже вопрос больше относится к стабильности точных вычислений на десятичных дробях</blockquote>Ну тут все просто. <br/>1. И в базовом питоне и в numpy нет типа “десятичные дроби” (я такой тип вообще ни в одном языке не встречал).<br/>2. Если вы имеете ввиду float, np.float то ни о каких точных вычислениях не может быть и речи. Это типы для приближенных вычислений которые всегда дают приближенный результат.<br/>3. Компьютер не человек, все вычисления с любыми числами всегда стабильны (в том смысле что они дают абсолютно идентичные результаты при последовательных запусках программы).<br/>
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-19T09:08:09+03:00JOHN_16203021<blockquote><em>@cckyi_boxxx</em><br/>но когда доходит до взаимодействия с python float переменными я не знаю как он себя ведет.</blockquote>А разве последний параграф в разделе <a href="https://docs.scipy.org/doc/numpy-1.15.0/user/basics.types.html#extended-precision">Extended Precision</a> не дает ответа на этот впорос?
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-19T03:24:57+03:00@cckyi_boxxx203019Ну с форматированием я разобрался, просто генерю строку если есть экспонента при помощи своей функции а если нет то штатным str, что до других либ тут уже вопрос больше относится к стабильности точных вычислений на десятичных дробях, ну и простоте работы разумеется, цепные это хорошо но тут я точно испытаю немало секаса для преобразования из десятичных и обратно.<br/><br/>что до numpy он юзает сишную либу для вычислений, и соответственно свои типы, вот они <a href="https://docs.scipy.org/doc/numpy-1.15.0/user/basics.types.html">https://docs.scipy.org/doc/numpy-1.15.0/user/basics.types.html</a> , но когда доходит до взаимодействия с python float переменными я не знаю как он себя ведет.
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-15T23:54:22+03:00doza_and202938<blockquote><em>@cckyi_boxxx</em><br/>подумывал юзать numpy или pandas, у них свои типы и работают они точно</blockquote>??? Насколько знаю у них double точно такой как и в питоне. Ну может формат принта другой.<br/><br/><blockquote><em>@cckyi_boxxx</em><br/>возможно под питон есть что-то позволяющее работать точно как numpy но не с массивами а с переменными (кроме Decimal)?</blockquote><br/>Это трудно понять. Скажем так, в питоне есть числа с которыми вычисления ведутся точно. Это целые числа. В sympy можете еще работать с рациональными дробями. Будет абсолютно точно. Еще неплохой результат получается если представлять числа цепными дробями. Результат будет вида 19/15 а не 1.26666666666666666666666666666666666666666666666666666666666666666666<br/>6666666666666666666666666666666666666666666666666666666666666666666666<br/>6666666666666666666666666666666666666666666666666666666666666666666666<br/>6666666666666666666666666666666666666666666666666666666666666666666666<br/>6666666666666666666666666666666666666666666666666666666666666666666666<br/>6666666666666666666666666666666666666666666666666666666666666666666666<br/>6666666666666666666666666666666666666666666666666666666666666666666666<br/>66666666667.<br/><br/>Вот вы на этом конкретном примере покажите какого вы всеже результата хотите добиться своим форматированем?
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-15T22:02:04+03:00@cckyi_boxxx202936<blockquote><em>Rodegast</em><br/>Если важна точность, то надо её определить и округлять входные данные и результаты вычислений до этой точности.<br/></blockquote>округление не спасет. так как на выходе тот-же float просто один мусор поменяется на другой или вовсе останется прежним как в приведенном ниже примере, + ошибки при математических операциях, я подумывал юзать numpy или pandas, у них свои типы и работают они точно, но в моем случае их не очень удобно использовать, возможно под питон есть что-то позволяющее работать точно как numpy но не с массивами а с переменными (кроме Decimal)?<br/><br/><div class="code"><pre> <span class="n">tsz</span> <span class="o">=</span> <span class="mf">1e-8</span>
<span class="k">with</span> <span class="n">localcontext</span><span class="p">(</span> <span class="n">Context</span><span class="p">(</span><span class="n">prec</span> <span class="o">=</span> <span class="mi">32</span><span class="p">,</span> <span class="n">rounding</span> <span class="o">=</span> <span class="n">ROUND_05UP</span> <span class="p">,</span> <span class="n">Emin</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">,</span> <span class="n">Emax</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">,</span> <span class="n">clamp</span><span class="o">=</span><span class="mi">1</span> <span class="p">,</span> <span class="n">capitals</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> <span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="n">Decimal</span><span class="p">(</span><span class="n">tsz</span><span class="p">))</span>
<span class="n">tsz</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">tsz</span><span class="p">,</span> <span class="mi">8</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">Decimal</span><span class="p">(</span><span class="n">tsz</span><span class="p">))</span>
<span class="o">>>></span> <span class="mf">1.0000000000000000209225608301284726753266340892878361046314239501953125e-8</span>
<span class="mf">1.0000000000000000209225608301284726753266340892878361046314239501953125e-8</span>
</pre></div>
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-15T14:45:17+03:00Rodegast202932> насколько я понял описанная по ссылке проблема в том что параметр prec слишком мал для точных вычислений<br/><br/>Не совсем, проблема в том что стандартный тип Decimal работает не верно. Он не позволяет задать точность вычислений. Например если я захочу поделить 22 рубля между 7-ю людьми, то у меня получится Decimal('3.142857142857142857142857143') что при финансовых расчётах не допустимо. Но и задать нужную точность через prec так что бы он автоматически округлял дробную часть тоже не получится.<br/><br/>> в моем случае стоит 32 хотя максимум что имею это 20 символов дробной + целой части<br/><br/>Ну как бы:<br/><div class="code"><pre> <span class="o">>>></span> <span class="nb">len</span><span class="p">(</span><span class="s2">"1.0000000000000000209225608301284726753266340892878361046314239501953125"</span><span class="p">)</span>
<span class="mi">72</span>
</pre></div><br/>> тут гораздо важнее точность вычислений и другого более подходящего модуля я не нашел.<br/><br/>Если важна точность, то надо её определить и округлять входные данные и результаты вычислений до этой точности.
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-15T09:45:36+03:00doza_and202926<blockquote><em>@cckyi_boxxx</em><br/>по сети все летит json-ом</blockquote>json как формат не поддерживает Decimal и у него не предусмотрены методы передачи доп информации о типе (в отличии например от yaml). Классическое решение при отправке преобразовать все Decimal в строки, а при получении отконвертировать их назад. При этом не будет потерь. Ну или использовать более подходящий протокол обмена.<br/>
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-15T00:03:37+03:00@cckyi_boxxx202924<blockquote><em>doza_and</em><br/>Если нужен Decimal то его и передают по сети</blockquote>ну по сети все летит json-ом и соответствующий модуль питона для работы с этим форматом переводит все числа с плавающей точкой во float, и возможно-ли этому модулю “обьяснить” что надо сразу в decimal я не знаю , поэтому поставил такой костыль и он работает.<br/><br/>Что до методов форматирования мою задачу ими не решить так как нужно единое решение для целых, дробных без экспоненты и дробных с экспонентой чисел, и без лишних нулей для нормального восприятия. Или я хуже вас разбираюсь в методах форматирования, что весьма вероятно.<br/><br/><strong>Rodegast</strong>, спасибо за предупреждение, насколько я понял описанная по ссылке проблема в том что параметр prec слишком мал для точных вычислений, в моем случае стоит 32 хотя максимум что имею это 20 символов дробной + целой части, тут гораздо важнее точность вычислений и другого более подходящего модуля я не нашел.<br/><br/>
Общий :: Python для новичков :: как избавится от экспоненты в переменной Decimal
2019-07-14T20:12:33+03:00doza_and202922<blockquote><em>@cckyi_boxxx</em><br/>полагаю должен быть более лаконичный способ.</blockquote>Думаю что нет лаконичного способа, просто потому что это никому не нужно. Если нужен Decimal то его и передают по сети, если приходит float то все нормальные люди понимают что 1.5 и 1.4999999999999 это одно и тоже. А любой разумный вывод как раз легко форматами настраивается, не зря алгоритмы форматирования при выводе уже десятки лет неизменны.