Trunc

107 views
Skip to first unread message

Maxim Molchanov

unread,
Jul 11, 2014, 10:14:26 AM7/11/14
to erlang-...@googlegroups.com
Коллеги, 

понимаю, что erlang и математика не совместимы, но как говорится, нужно.
Столкнулся с нестандартным поведением trunc:

1> erlang:trunc(63338679359409180.0).
63338679359409184

Проверил 17 и 16 релизы (Erlang/OTP 17, Erlang R16B03-1)

Кто нибудь ловил эти грабли? 
Заранее благодарен за подсказки куда копать.

Antonio Nikishaev

unread,
Jul 11, 2014, 10:22:50 AM7/11/14
to erlang-...@googlegroups.com

On 11 Jul 2014, at 18:14, Maxim Molchanov <mr.e...@gmail.com> wrote:

> Коллеги,
>
> понимаю, что erlang и математика не совместимы, но как говорится, нужно.
> Столкнулся с нестандартным поведением trunc:

Более чем стандартное.

1> 63338679359409180.0 + 1.
63338679359409180.0

оно просто “не влезает” в double

Ghost

unread,
Jul 11, 2014, 10:29:15 AM7/11/14
to erlang-...@googlegroups.com
Антон, а так тоже стандартно? :)

25> 63338679359409180.0 + 65.
63338679359409250.0

Antonio Nikishaev

unread,
Jul 11, 2014, 10:39:54 AM7/11/14
to erlang-...@googlegroups.com
Да.
В чём проблема?
> --
> Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russia...@googlegroups.com.
> Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-...@googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Evgeny M

unread,
Jul 11, 2014, 11:09:15 AM7/11/14
to erlang-...@googlegroups.com
В питоне кстати точно так же

>math.trunc(63338679359409180.0)
63338679359409184
>63338679359409180.0 + 65
6.333867935940925e+16
>math.trunc(63338679359409180.0 + 65)
63338679359409248


пятница, 11 июля 2014 г., 18:14:26 UTC+4 пользователь Maxim Molchanov написал:

Lev Walkin

unread,
Jul 11, 2014, 11:36:32 AM7/11/14
to erlang-...@googlegroups.com
Будто в каком-нибудь питоне не так?

--
Lev
> Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу erlang-...@googlegroups.com.
> Настройки подписки и доставки писем: https://groups.google.com/d/optout.
>

Dmitry Belyaev

unread,
Jul 11, 2014, 11:52:16 AM7/11/14
to erlang-...@googlegroups.com, Maxim Molchanov
Коллеги,

Давайте уже прекращать стебатся. Представление чисел с плавающей запятой проходят если не в школе на уроках информатики, то уж точно на первом курсе любой CS специальности. Даже можно ничего не помнить из всего этого, кроме того, что точность таких чисел _ограничена_.

Хотите точных - http://www.haskell.org/onlinereport/ratio.html
--
Best wishes,
Dmitry Belyaev

Max Lapshin

unread,
Jul 11, 2014, 3:59:22 PM7/11/14
to erlang-...@googlegroups.com, Maxim Molchanov
Нет, этого точно нет в школе и нет, например, на ВМиК МГУ.

Так что знание структуры double — это вопрос исключительно самообразования.

Taras Halturin

unread,
Jul 11, 2014, 4:05:11 PM7/11/14
to erlang-...@googlegroups.com, Maxim Molchanov
Там еще беда в том, что оно упаковывается по-разному на 32 и 64 битных режимах. ну и носить эту инфу в голове как-то малонуждабельно.

Вообще, изначально задача немного по-другому у нас с Максимом (топикстартером) стояла - нужно средствами эрланга вытащить степень 10 из флоата. т.е. представление 1.23 должно быть вида 123 * 10(-2). если на обычных ссях это делается легко, ибо имеешь прямой доступ к представлению числа в бинарном виде и мантису с основанием можно вытащить "одной левой", то с эрлангом все несколько сложнее.

Быть может у кого есть лаконичный вариант решения такой задачи?



2014-07-11 23:59 GMT+04:00 Max Lapshin <max.l...@gmail.com>:
Нет, этого точно нет в школе и нет, например, на ВМиК МГУ.

Так что знание структуры double — это вопрос исключительно самообразования.

--
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "Erlang по-русски".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/erlang-russian/j8nJ_qw_RPA/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес erlang-russia...@googlegroups.com.

Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
With Best Regards.
Taras Halturin

Danil A. Zagoskin

unread,
Jul 11, 2014, 5:24:44 PM7/11/14
to erlang-...@googlegroups.com, Maxim Molchanov
Прямой доступ к представлению числа в бинарном виде (http://erlang.org/doc/apps/erts/erl_ext_dist.html#id90652):

3> <<131, 70, IEEEFloat/binary>> = term_to_binary(2/7), IEEEFloat.
<<63,210,73,36,146,73,36,146>>

А дальше разбирайте как хотите.


--
Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russia...@googlegroups.com.

Taras Halturin

unread,
Jul 11, 2014, 5:35:17 PM7/11/14
to erlang-...@googlegroups.com, Maxim Molchanov
Даниил, 

даже больше скажу...  <<Sign:1,Exp:11,F:52>> = <<FloatNumber:64/float>>. Еще из экспоненты надо вычесть 1023, а потом если число больше 51, то одним способом делать вычисления, иначе - другим. Не все так просто, как кажется на первый взгляд.

Dmitry Belyaev

unread,
Jul 11, 2014, 11:49:04 PM7/11/14
to erlang-...@googlegroups.com, Max Lapshin, Maxim Molchanov
Гугл по запросу "вмик представление числа с плавающей точкой в памяти"
находит http://asmcourse.cs.msu.ru/wp-content/uploads/2011/06/Slides14.pdf и не только.

--
Best wishes,
Dmitry Belyaev

Max Lapshin

unread,
Jul 12, 2014, 5:38:13 AM7/12/14
to Dmitry Belyaev, erlang-...@googlegroups.com, Maxim Molchanov
2011 год.

В 2001 году рассказывали про то, как в реальном режиме регистрами сегментов жонглировать.
Reply all
Reply to author
Forward
0 new messages