AntonioModer's blog
GameDev.ru / Страницы / AntonioModer's blog / Форум / LuaJIT меня убил (комментарии) (2 стр)

LuaJIT меня убил (комментарии) (2 стр)

Поделиться

Страницы: 1 2 3 Следующая

=A=L=X=Постоялецwww23 мая 20165:50#15
gammaker
> Откуда вообще это слово взялось?

TarasB нарёк.

AntonioModerПостоялецwww23 мая 201610:22#16
Delfigamer
> А в качестве домашнего задания ты должен рассказать, почему если
> math.sin(math.pi) возвращает ноль - это ошибка.
Потому что очень маленькое число получается
string.format('%.15f', math.sin(math.pi))  -- > 0.000000000...

Вообще в тригонометрии: синус Пи = 0.
Это не ошибка.
Ошибка если не равен нулю.

Правка: 23 мая 2016 10:35

DelfigamerПостоялецwww24 мая 20166:53#17
AntonioModer
math.pi - это не точное число пи, а его приближение до энной цифры. В результате должна вылезти разница.
Впрочем, так происходит не всегда. Есть процессоры, которые хранят меньше цифр числа пи, чем следует, и в этом районе теряют дохрена знаков точности. А на графических ядрах - вообще ряды Тейлора и беспредел. То есть, математические функции у тебя считаются не до последней значащей цифры (так работает только арифметика), а примерно как-нибудь около приблизительно. Что делает питуха ещё более плавающим.

Правка: 24 мая 2016 7:01

AntonioModerПостоялецwww24 мая 201612:32#18
Delfigamer
> math.pi - это не точное число пи, а его приближение до энной цифры. В
> результате должна вылезти разница.
Ты читал пост выше, или монолог ведешь?

Правка: 24 мая 2016 12:35

SuslikМодераторwww24 мая 201616:21#19
arprog
> #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;
> }
> Аналогично
Crunatus
> Или можешь просто запомнить как факт, что инициализация каждого нового цикла,
> критичнее итерации, [b]в любом языке программирования[/b].
Crunatus
> for состоит из фазы инициализации, последовательного вызова итерирующей
> функции, и собственно тела.
вы там упоролись что ли? https://ideone.com/ryTKDQ
test1 = 1825948.000000 microseconds
test2 = 1824508.000000 microseconds, debug: 1080604611.755329

с чего вообще в плюсах должна быть хоть какая-то разница, если парадигма "платишь только за то, что используешь" — фактически основной принцип языка?

Правка: 24 мая 2016 16:22

key0Постоялецwww25 мая 201611:53#20
добавил по 0 в больших циклах, на смарте -c4droid (g++) =>
test1 = 9.271472
test2 = 10.184864
СЕКУНДА!
.. а если сделать unsigned long long i,j;
=>
test1 = 13.105941
test2 = 12.184399
- дольше и наоборот секунда

Правка: 25 мая 2016 13:33

DelfigamerПостоялецwww26 мая 20163:33#21
AntonioModer
> Ты читал пост выше, или монолог ведешь?
Читал и говорю, в чём ошибся ты.
AntonioModer
> Вообще в тригонометрии: синус Пи = 0.
Всё верно, однако,
Delfigamer
> math.pi - это не точное число пи, а его приближение до энной цифры.
Подобно тому, как 2.001 - на самом деле не 2.001, а 0x1.0020c49ba5e35p1; math.pi - это не число π, а 0x1.921fb54442d18p1. Если из настоящего числа π вычесть это приближение, получится ненулевая разница, обозначим её α.
Попробуем теперь найти значение синуса.
sin(math.pi) = sin(π - α) = sin(α)
α - очень малый угол, но он не равен нулю. Значит, и его синус будет малой, но ненулевой величиной, а именно - 0x1.469898cc51701b839a2... · 2-51. В конце стоит многоточие, потому что, как и π, это число иррациональное - на этом знаки не заканчиваются, однако, опять же, компьютер может записать только конечное число цифр, поэтому ответ округляется. В идеальном случае, math.sin(math.pi) должно вернуть 0x1.469898cc51702p-51. Если он возвращает что-то другое - это ошибка. В том числе ноль - это грубая ошибка.

Правка: 26 мая 2016 3:35

slava_mibМодераторwww26 мая 20165:05#22
> вы там упоролись что ли?
Suslik, плюсы - это плюсы, а остальные ЯП, особенно скриптовые - они отдельно.
AntonioModerПостоялецwww26 мая 201616:19#23
Delfigamer
> > Вообще в тригонометрии: синус Пи = 0.
> Всё верно, однако,
Delfigamer
> В идеальном случае, math.sin(math.pi) должно вернуть 0x1.469898cc51702p-51.
> Если он возвращает что-то другое - это ошибка. В том числе ноль - это грубая ошибка.
Нету "однако", синус Пи = 0 и точка.
Доказательство:
- координаты в окружности R=1: ПИ(x=-1, y=0), cos - это x, sin - это y => sin(y=0) = 0
- координаты ПИ - это целые числа, не иррациональные
(значение углов: https://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B8%D0%B3%D0%BE%D0%B… B.D0.BE.D0.B2)

Правка: 26 мая 2016 16:25

Dmitry_MilkПостоялецwww26 мая 201619:47#24
Кому принципиально надо точную в особых углах тригонометрию - можно завести какой-нибудь тип Angle, хранящий угол как рациональный коэффициент (отношение двух сверхдлинных интов) перед PI. Тригонометрию реализовать методами, внутри методов вызывать подходящие функции с учетом квадрантов и только в диапазоне -PI/8 : PI/8. Ну и конструкторы угла реализовать для градусов, радиан и коэффициентов PI.
entrywayПостоялецwww27 мая 201610:46#25
Меня убила темная тема на скриншоте. Чуть глаза не сломал пока развидел.
Вспомнил сайты из 90х, когда любили писать синим по черному

Правка: 27 мая 2016 10:53

AntonioModerПостоялецwww27 мая 201614:19#26
entryway
> Меня убила темная тема на скриншоте. Чуть глаза не сломал пока развидел.
> Вспомнил сайты из 90х, когда любили писать синим по черному
Это ночная тема, не для тусклых мониторов типа TN, минимум IPS.
От белого фона у меня глаза напрягаются сильно, даже на минимальной яркости моника.
Потом на черном лучше виден разноцветный текст, чем на белом.

Синий по черному - это жесть конечно.
У меня не синим, а голубым по черному, он легче виден.

Dmitry_Milk
> Кому принципиально надо точную в особых углах тригонометрию - можно завести ...
На чистом Луа такой тип не сделаешь.

Правка: 27 мая 2016 14:23

DelfigamerПостоялецwww28 мая 201611:13#27
Dmitry_Milk
> Кому принципиально надо точную в особых углах тригонометрию - можно завести
> какой-нибудь тип Angle, хранящий угол как рациональный коэффициент (отношение
> двух сверхдлинных интов) перед PI.
Зачем сверхдлинных? Можно представить угол в виде 2-15 N π и затем хранить N в 16-битном целом. Тогда и у прямого угла будет точное представление, и модульная арифметика будет работать на пользу.

AntonioModer
> Нету "однако", синус Пи = 0 и точка.
Ты опять пропускаешь мимо ушей самое главное - math.pi ≠ π.

Правка: 28 мая 2016 11:14

AntonioModerПостоялецwww28 мая 201614:04#28
Delfigamer
> Ты опять пропускаешь мимо ушей самое главное - math.pi ≠ π.
Вообще не существует точного представления ПИ.

Правка: 28 мая 2016 14:05

ArochПостоялецwww28 мая 201616:35#29
AntonioModer
> На чистом Луа такой тип не сделаешь, имхо.
fixed

Чтобы ты дальше не спотыкался, подскажу координаты еще парочки камней:
1) используй math.floor/math.ceil для дробей, если тебе нужно в дальнейшем работать как с целым числом, в противном случае lua округлит за тебя, не отбросит дробную часть как в си а именно округлит.
2) для подобных циклов for i=1,f(x) do print(i) end здесь f(x) будет вычислено один раз при старте цикла, ты не можешь изменять переменную i внутри цикла, переменная i является локальной, используя ее в попытке получить значение после цикла ни к чему хорошему не приведет.

Страницы: 1 2 3 Следующая

/ Форум / AntonioModer's blog

2001—2017 © GameDev.ru — Разработка игр