AntonioModer's blog

LuaJIT меня убил

Автор:

LuaJIT подводные камни:

LuaJIT WUT | LuaJIT меня убил

Я в шоке. :(

#Lua, #luajit, #блог

17 мая 2016

Комментарии [32]

Страницы: 1 2 3 Следующая »
#1
16:35, 19 мая 2016
#include <stdio.h>
#include <time.h>
#include <math.h>

int main()
{
    int i, j;
    long t1, t2, t3;
    double r;
  
  t1 = clock();

    for (i = 0; i < 10; ++i)
    {
        for (j = 0; j < 10000000; ++j)
        {
            r = cos(1);
        }
    }

    t1 = clock() - t1;
    printf("test1 = %f\n", (float)t1 / CLOCKS_PER_SEC);

    t2 = clock();

    for (i = 0; i < 10000000; ++i)
    {
        for (j = 0; j < 10; ++j)
        {
            r = cos(1);
        }
    }

    t2 = clock() - t2;
    printf("test2 = %f\n", (float)t2 / CLOCKS_PER_SEC);
  
    return 0;
}

Аналогично

#2
23:16, 19 мая 2016

arprog
> Аналогично
Серьезно? о.О
Вот так раз.
Я не программировал на С++, поэтому не знал.

#3
1:20, 20 мая 2016

В книге Программирование на Lua - Роберту Иерузалимски, это как раз очень подробно объясняется, почему всё происходит именно так, а не иначе. Или можешь просто запомнить как факт, что инициализация каждого нового цикла, критичнее итерации, в любом языке программирования.

#4
10:48, 20 мая 2016

> Или можешь просто запомнить как факт, что инициализация каждого нового цикла, критичнее итерации, в любом языке программирования.
Crunatus

+ Показать
#5
16:25, 20 мая 2016

slava_mib
for состоит из фазы инициализации, последовательного вызова итерирующей функции, и собственно тела.
В первом случае, мы 10 раз инициализируем новый цикл, во втором 10000000.
Сама итерирующая функция выполняет минимум действий в отличии от инициализации, поэтому первый вариант, всегда будет выполняться быстрее второго.

#6
20:35, 20 мая 2016

Еще одну шнягу нашел:
2.001 - 2 == 0.00099999999999989
нужно 2.001 - 2 == 0.001

Жесть.

Правильно будет так:

string.format('%0.3f', 2.001 - 2) == 0.001

Это ж скоко гемора будет, ааа!
У меня бомбит очень-очень. :D :(

#7
20:44, 20 мая 2016

> for состоит из фазы инициализации, последовательного вызова итерирующей функции, и собственно тела.
Crunatus, теперь понял.

> Жесть.
AntonioModer, такие ошибки - это вцелом норма, не только для ЛУА, а вообще.

#8
21:22, 20 мая 2016

slava_mib
> такие ошибки - это вцелом норма, не только для ЛУА, а вообще.
И как с ними бороться правильно?

#9
22:12, 20 мая 2016

AntonioModer
> И как с ними бороться правильно?
Просто не сравнивают дробные числа на равенство. Вместо этого проверяют, что абсолютная разность меньше эпсилон. Но тут тоже не всегда понятно, какое эпсилон брать.

#10
0:49, 21 мая 2016

gammaker
> Просто не сравнивают дробные числа на равенство.
Мне нужна была разность, т.е. дробная часть.
Тоже самое получается не верно: 2.001%1 = 0.00099999999999989

#11
19:44, 21 мая 2016

AntonioModer
потому что флоаты храняться в двоичной системе, а не в десятичной. 0.5 или (1/1024) в них представить можно, а 0.001 - нельзя, в двоичной системе это бесконечная дробь. А если ее округлить получается число которое ты написал.
Короче, просто смирись с тем что нет никаких "==", числа всегда могут отличаться где-то в младшем разряде.

#12
22:01, 21 мая 2016

kipar
> Короче, просто смирись с тем что нет никаких "==", числа всегда могут
> отличаться где-то в младшем разряде.
Я уже смирился :(
Самое паскудное, что придется числа контролировать постоянно.
Пересмотрел в книге Lua про числа, Роберту пишет об этом случае.

#13
22:56, 22 мая 2016
>> string.format('%.16f', 2.001)
2.0009999999999999
>> string.format('%.16e', 0x2.004189374bc6a0-2)
9.9999999999988987e-004
>> string.format('%.16e', 0x2.004189374bc6af-2)
9.9999999999988987e-004
>> string.format('%.16e', 0x2.004189374bc6b-2)
1.0000000000003340e-003

АнтониоМодер, знакомься, это плавающий питух. Плавающий питух, знакомься, это АнтониоМодер.
А в качестве домашнего задания ты должен рассказать, почему если math.sin(math.pi) возвращает ноль - это ошибка.

#14
0:11, 23 мая 2016

Delfigamer
> АнтониоМодер, знакомься, это плавающий питух.
  А почему его питухом называют? Откуда вообще это слово взялось?

Страницы: 1 2 3 Следующая »
AntonioModer's blog

Тема в архиве.