<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Странная типизация результата]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Странная типизация результата форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 02 May 2026 22:14:17 +0300</pubDate>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30611/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_JJSpT4Tn" href="/user/3010/" bx-tooltip-user-id="3010">Алексей</a> написал:<br />1. При сравнении двух double чисел последние 16 разрядов мантиссы игнорируются, что соответствует 12-13 значащим цифрам в десятичном представлении числа.<br /><br />=============<br />Первый раз такое слышу... это вообще откуда такое?... можно ссылочку.<br />Подозреваю, что вы перепутали 64-хбитный double и внутрисопроцессорный 80-ибитный long double. Эти 16 разрядов отбрасываются не от double'а, а от вычисленного внутри сопроцессора long double при возврате обратно из сопроцессора и привидении его к типу double, то-есть 80-16=64. Точность double при сравнении не меняется, там около 17 десятичных цифр получается.<br /><br />Такой вот простой .lua файл:
====code====
<pre>local&nbsp;&nbsp;&nbsp;&nbsp; DBL_EPSILON = 2.2204460492503131e-016
local NOT_DBL_EPSILON = DBL_EPSILON/2

local function checkDblEpsilon(v1, v2)
&nbsp;&nbsp;&nbsp;&nbsp;message(string.format("(%.20g == %.20g) == ", v1, v2)..(v1 == v2 and "true" or "false"))
end

checkDblEpsilon(1.0, 1.0+NOT_DBL_EPSILON)
checkDblEpsilon(1.0, 1.0+DBL_EPSILON)
</pre>
=============
Выдаёт:
====code====
<pre>(1 == 1) == true
(1 == 1.0000000000000002) == false
</pre>
=============
Как и положено. Никакие последние разряды не откидываются. <br />
			<i>18.04.2018 01:58:13, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30611/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30611/topic3590/</guid>
			<pubDate>Wed, 18 Apr 2018 01:58:13 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30609/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_i3UVJWpr" href="/user/3010/" bx-tooltip-user-id="3010">Алексей</a> написал:<br />1. При сравнении двух double чисел последние 16 разрядов мантиссы игнорируются, что соответствует 12-13 значащим цифрам в десятичном представлении числа.<br /><br />=============<br />Осмелюсь предположить, что вы ошибаетесь. &nbsp;Если мы говорим об архитектуре x86, то раньше, когде не было еще всяких MMX/SSE, в процессоре были только 80-битные регистры, в которых производились вычисления как double, так и long double. &nbsp;И вот для double последние 16 бит игнорировались, чтобы сравнивались только 64 бита. &nbsp;В QLua вроде все работает, как ожидается:<br />
====code====
<pre>qlua&#62; 1.0000000000000003 == 1.0000000000000004
false
qlua&#62; 1.0000000000000003 ~= 1.0000000000000004
true
qlua&#62; 1.0000000000000003 &#60; 1.0000000000000004 
true
qlua&#62; 1.0000000000000003 &#62; 1.0000000000000004
false
</pre>
=============
Или я не прав?<br /><br /><br /><br />====quote====<br />На самом деле, при сложении исходно целых чисел ошибка не возникает, а вот при вычитании ошибка ИНОГДА возникает: вы получаете результат на 1 разряд мантиссы меньше, чем должно быть. <br /><br />=============<br />А пример такой есть? &nbsp;Я могу представить ситуацию, если магнитуды чисел существенно отличаются. &nbsp;Но в общем случае не припомню чего-то подобного (но я и не претендую на глубокое понимание вопроса, мог и не знать). &nbsp;Пример, или ссылку на почитать, плиз :).<br /><br /><br />В любом случае, проблему OP вы не адресуете, он уверен, что на входе целые числа (правда какие - не говорит, код - не показывает). &nbsp;Гипотеза - сборщик мусора подворовывает из результатов вычислений, я так понял (опять же, нам не объясняют как, предлагают просто поверить). &nbsp;Я бы еще мог предположить, что подключается какой-то дикий модуль на C, который плугом вспахивает всю память, но тогда бы все просто взорвалось, а вот вместо 2 получить 1.999999999991 - это почерк прфессионала. &nbsp;<a class="blog-p-user-name" id="bp_ioAjQqDp" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал пример, да вот беда: результат первого вычисления x = 10 - будет &quot;подпоркой&quot; для второго (при x=10 все работает - доказано!), результат второго опять x = 10 - будет &quot;подпоркой&quot; для третьего, и сборщик мусора ничего не украдет :(. &nbsp;Тут нужно глубже копать, читать Иерусалимски, разбираться, откуда растет утверждение<br />====quote====<br /><a class="blog-p-user-name" id="bp_jL4JbTyi" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br />Была бы в Lua четкая типизация данных, такого эффекта не могло бы быть в принципе.<br />Жаль, что все идет в виде union.<br />=============<br />Ну и радоваться, что нам достались версии Quik безо всех этих проблем :). <br />
			<i>17.04.2018 19:58:02, kroki.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30609/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30609/topic3590/</guid>
			<pubDate>Tue, 17 Apr 2018 19:58:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30605/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_mcC6yko0" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br />x = (y-z)*param &nbsp;<br />-- результат в x оказывается числом с плавающей точкой (double). Ошибка в расчетах!<br /><br />=============<br />Приведите, пожалуйста, конкретные значения y, z и param, которые дают x - double.<br />Где-то выше обсуждалось, что 1.9999.... &lt;&gt; 2, но это здесь ни при чем, т.к. в вашем &quot;целочисленном&quot; умножении невозможно получить x=2 (кроме как в 2*1, но здесь не бывает ошибки)<br /><br />Кроме того,<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_1rrOSYIT" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br /> пишу я, скажем, x = 3. Да, по факту оно хранится как double (допустим, как 3,000000000001)<br />=============<br />НЕТ! По факту оно хранится как 01000000 00001000 00000000 00000000 00000000 00000000 00000000 00000000, т.е ровно 3, и никак иначе! Любые целые числа (в допустимом диапазоне) представляется в double с абсолютной точностью.<br /><br />НО, учитывайте, что:<br />1. При сравнении двух double чисел последние 16 разрядов мантиссы игнорируются, что соответствует 12-13 значащим цифрам в десятичном представлении числа.<br />2. Перед сложением (вычитанием) двух double чисел их мантиссы выравниваются по экспоненте (порядку), в результате вы получаете ошибку в последнем разряде. У чисел ~2 и ~5 уже экспонента отличается на 1 разряд, т.е при их сложении (вычитании) теоретически может возникнуть ошибка в последнем разряде мантиссы. И ошибка ГАРАНТИРОВАННО возникает, если в мантиссе меньшего из складываемых чисел последние два разряда - не нулевые.<br />На самом деле, при сложении исходно целых чисел ошибка не возникает, а вот при вычитании ошибка ИНОГДА возникает: вы получаете результат на 1 разряд мантиссы меньше, чем должно быть. <br />Т.е., например, вместо 100 (01000000 01011001 00000000 00000000 00000000 00000000 00000000 00000000) Вы можете получить ближайшее меньшее в double арифметике число 99.999999999999985789145284798..... (01000000 01011000 11111111 11111111 11111111 11111111 11111111 11111111). Это все еще 100 с &quot;запасом&quot; в 15 разрядов.<br />При умножении все то же самое. Сделайте подряд более 16 действий с &quot;целыми&quot; double числами и ошибка может накопиться до 16 разряда мантиссы. Результат: вы получаете &quot;нецелое&quot; число в результате. <br />
			<i>17.04.2018 18:01:55, Алексей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30605/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30605/topic3590/</guid>
			<pubDate>Tue, 17 Apr 2018 18:01:55 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30604/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_dmBS1nfO" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br />Suntor, и вы туда же.<br />Мне что: больше делать нечего, кроме как моделировать странный эффект?<br />Я вам привел функцию, можете оставить в ней вообще 5 строк и воспроизводить хоть миллион раз. Только, прежде чем соберетесь увидеть этот эффект, увеличьте объем своего программного кода до 200К<br />=============<br />Сделал .lua файл с таким содержанием:
====code====
<pre>local function func()
&nbsp;&nbsp;&nbsp;&nbsp;local x, y, z, param
&nbsp;&nbsp;&nbsp;&nbsp;y = 10
&nbsp;&nbsp;&nbsp;&nbsp;z = 5
&nbsp;&nbsp;&nbsp;&nbsp;param = 2
&nbsp;&nbsp;&nbsp;&nbsp;x = (y-z)*param
&nbsp;&nbsp;&nbsp;&nbsp;message("x = "..x)
&nbsp;&nbsp;&nbsp;&nbsp;x = (y-z)*param
&nbsp;&nbsp;&nbsp;&nbsp;message("x = "..x)
&nbsp;&nbsp;&nbsp;&nbsp;x = (y-z)*param
&nbsp;&nbsp;&nbsp;&nbsp;message("x = "..x)
end

func()</pre>
=============
Запустил у себя и получил чётко три сообщения с текстом:<br /><B>x = 10</B><br /><B>x = 10</B><br /><B>x = 10</B><br />Ничего удивительно.<br /><br />Теперь, можете скопировать эту функцию <B>(НЕ МЕНЯЯ В НЕЙ НИ ОДНОЙ СТРОЧКИ КОДА!)</B> внутрь своего «большого» 200К скрипта, и посмотреть вывод сообщений.<br />Я уже знаю в общем-то что у вас получится, но нужно, чтобы вы сами в этом убедились... <br />
			<i>17.04.2018 16:03:48, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30604/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30604/topic3590/</guid>
			<pubDate>Tue, 17 Apr 2018 16:03:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30596/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Suntor, и вы туда же.<br />Мне что: больше делать нечего, кроме как моделировать странный эффект?<br />Я вам привел функцию, можете оставить в ней вообще 5 строк и воспроизводить хоть миллион раз. Только, прежде чем соберетесь увидеть этот эффект, увеличьте объем своего программного кода до 200К (без учета объема комментариев) - неважно чем. Вот, тогда и увидите. Это отдельно стоящий, ни с чем несвязанный (ни с какими-либо другими функциями, данными) участок кода. Можете считать его полностью локализованным.<br />Действие "подпорки" в виде "x=10" однозначно говорит о наличии погрешности при заполнении структуры, отвечающей за идентификацию переменной в Lua. Вопрос в том, из-за чего происходит эта погрешность. Один из возможных вариантов: фоновый вызов сборщика мусора с недостаточной для имеющихся условий частотой. Почему, собственно я и просил разработчиков указать заложенную в текущей реализации терминала частоту вызова сборщика мусора при работающем пользовательском скрипте. <br />
			<i>17.04.2018 13:41:43, Andrei2016.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30596/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30596/topic3590/</guid>
			<pubDate>Tue, 17 Apr 2018 13:41:43 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30577/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_jBy6CdK0" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br />Suntor, так я привел его в своем первом сообщении.<br />=============<br />Это не код... это его схема с комментариями... так ошибку не поймать.<br /><br />Эту функцию вашу, где происходит глюк в математике, вынесите в отдельный .lua файл... отрежьте всё лишнее, чтобы остались только те несколько строчек с вычислениями где глючит... но код должен быть рабочий со значениями констант, чтобы его можно было запустить и воспроизвести эффект... после этого его сюда киньте, и мы посмотрим в отладчиках и по коду, что там реально происходит... чтобы найти причину<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_rsMEnH0N" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br />Решение оказалось не менее странным, чем сам эффект:<br />Перед третьим присваиванием &quot;x = (y-z)*param&quot; нужно добавить еще одно присваивание, скажем так:<br />&quot;x=10&quot;. Все - на этом эффект числа с плавающей точкой в x исчезает, и message выводит нормальное 2.<br />А теперь, если вы уберете &quot;подпорку&quot;, эффект double возвращается на место.<br />=============<br />Никогда так не делайте... вы закрыли непонятную ошибку, непонятной заплаткой... проблема осталась и выплывет в будущем в самый неподходящий момент. В результате, можете просто деньги потерять от заглючившего скрипта... <br />
			<i>16.04.2018 19:24:51, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30577/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30577/topic3590/</guid>
			<pubDate>Mon, 16 Apr 2018 19:24:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30576/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_DmZCewex" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br /><br />====quote====<br /> Andrei2016 &nbsp; написал:<br />kroki,<br />проблема в том, что эффект проявился на 11-м знаке, а не на 17-м:<br />вместо 2 message выдал 1.999999999991. Это первое.<br />Второе. Я же четко написал: присваивается операнду ЦЕЛОЧИСЛЕННОЕ значение, т.е. условно "x=10".<br /><br />=============<br />Выложите сюда фрагмент кода с ошибкой, чтобы мы смогли его запустить у себя на Quik и воссоздать ситуацию. Тогда быстрее поможем найти ошибку...<br />=============<br /><br />Suntor, так я привел его в своем первом сообщении. В том-то и дело, что ничего подобного такому эффекту быть не должно. Поэтомуречь и идет не об ошибке, а об эффекте. Меня же интересовал вопрос, из-за чего может проявиться такой эффект: дважды после присаивания значения integer все происходит идеально, на третий раз - результат не целочисленный, а с плавающей точкой.<br />Как я понял, ни у кого подобный эффект не проявлялся. Ну. на нет - и суда нет.<br />Кстати, "подпорку" для решения вопроса я уже соорудил. Вы будете долго смеяться, когда узнаете как. :)<br />Решение оказалось не менее странным, чем сам эффект:<br />Перед третьим присваиванием "x = (y-z)*param" нужно добавить еще одно присваивание, скажем так:<br />"x=10". Все - на этом эффект числа с плавающей точкой в x исчезает, и message выводит нормальное 2.<br />А теперь, если вы уберете "подпорку", эффект double возвращается на место. <br />
			<i>16.04.2018 18:30:09, Andrei2016.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30576/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30576/topic3590/</guid>
			<pubDate>Mon, 16 Apr 2018 18:30:09 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30575/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			kroki,<br />почитайте на досуге товарища Р.Иерусалимски - создателя Lua - относительно типизации значений и переменных в Lua. И тогда все ваши рассуждения по поводу 14, 17 и 19-го знаков пойдут лесом.<br />Вам русским языком говорят: ПРИСВАИВАЕТСЯ ЦЕЛОЧИСЛЕННОЕ значение. Понимаете: ПРИСВАИВАЕТСЯ, а не предполагается. Если вам это непонятно, то говорить не о чем.<br />По поводу очевидных доказательств. Вы предлагаете мне запостить на форуме порядка 200К программного кода? Можете заняться этим сами, если ARQA позволит. Кусок кода, где проявился эффект я привел. Можете искать очевидное или невероятное сколько влезет. Меня же интересовало мнение других, сталкивался кто-либо с таким эффектом или нет. Кто смог сказать что-то по делу, сказал. <br />
			<i>16.04.2018 18:19:56, Andrei2016.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30575/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30575/topic3590/</guid>
			<pubDate>Mon, 16 Apr 2018 18:19:56 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30573/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Забыл про эту часть:<br />====quote====<br /><a class="blog-p-user-name" id="bp_WpxAglhC" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br />Мои опыты показали, при падении объема скрипта до уровня примерно 50К-60К (просто за счет физического убирания нескольких процедур, при оставлении неизменным содержимого сбойной операции), все становится идеально.<br />То, что QLua в плане своей &quot;аппаратной&quot; (назовем так) реализации существенно отличается от того же Lua for Windows, - это уже и проверенный, и доказанный не только мною факт. Зачем опровергать очеивдное?<br />=============<br />Ммм, хотя что тут можно сказать? &nbsp;В МИД Англии или США вас ждет прекрасное будушее :). &nbsp;На наших же просторах доказательства нужно приводить, а не только утверждать, что они у вас есть. &nbsp;Есть что-то там &quot;очевидно&quot; - пожалуйста, покажите. <br />
			<i>16.04.2018 16:50:39, kroki.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30573/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30573/topic3590/</guid>
			<pubDate>Mon, 16 Apr 2018 16:50:39 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30572/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_cq2R04AA" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br />проблема в том, что эффект проявился на 11-м знаке, а не на 17-м:<br />вместо 2 message выдал 1.999999999991. Это первое.<br /><br />=============<br />Происходит следующее: у вас после 14-го знака есть дробная часть, но вы своим &quot;элементарным&quot; тестом ее не видите из-за округления. &nbsp;После умножения на param эта дробная часть передвигается в 11-й знак, вы начинаете ее видеть и дивиться.<br /><br /><br />====quote====<br />Второе. Я же четко написал: присваивается операнду ЦЕЛОЧИСЛЕННОЕ значение, т.е. условно &quot;x=10&quot;.<br /><br />=============<br />Нет, вы вполне &quot;четко&quot; написали, что вы <I>думаете</I>, что присваивается целое, а на вопрос, почему вы так думаете, вы показали <I>неверную</I> проверку. &nbsp;Вы думаете, что<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_2AsBbLVx" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br />Т.е., пишу я, скажем, x = 3. Да, по факту оно хранится как double (допустим, как 3,000000000001). Но для пользователя это трактуется как 3.<br />=============<br />а это вообще нонсенс. &nbsp;Фактически вы и утверждаете, что в вашей терминологии 3,000000000001 - целое. &nbsp;Поэтому не нужно никаких &quot;условно x=10&quot;, прямо перед строкой x = (y-z)*param сделайте присвоение своих целых значений всем переменным, и убедитесь, что результат - тоже целое. &nbsp;Или проверьте, что y == math.floor(y) (и также для z и param). &nbsp;Ну или покажите эти числа, как вам уже дважды предложили. &nbsp;Это, конечно, если вы хотите решить свою проблему, а не продолжать заблуждаться, будто компьютер вас обманывает... <br />
			<i>16.04.2018 16:38:30, kroki.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30572/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30572/topic3590/</guid>
			<pubDate>Mon, 16 Apr 2018 16:38:30 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30570/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_aAclPd9T" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br />kroki,<br />проблема в том, что эффект проявился на 11-м знаке, а не на 17-м:<br />вместо 2 message выдал 1.999999999991. Это первое.<br />Второе. Я же четко написал: присваивается операнду ЦЕЛОЧИСЛЕННОЕ значение, т.е. условно &quot;x=10&quot;.<br /><br />=============<br />Выложите сюда фрагмент кода с ошибкой, чтобы мы смогли его запустить у себя на Quik и воссоздать ситуацию. Тогда быстрее поможем найти ошибку... <br />
			<i>16.04.2018 15:26:50, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30570/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30570/topic3590/</guid>
			<pubDate>Mon, 16 Apr 2018 15:26:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30568/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			kroki,<br />проблема в том, что эффект проявился на 11-м знаке, а не на 17-м:<br />вместо 2 message выдал 1.999999999991. Это первое.<br />Второе. Я же четко написал: присваивается операнду ЦЕЛОЧИСЛЕННОЕ значение, т.е. условно "x=10".<br />Вариант, который вы приводите в качестве аргумента - "local x = 1.000000000000007", изначально содержит число с плавающей точкой, а не целочисленное. Посему к моему случаю ваш пример отношения не имеет.<br />Относительно остального: речь в принципе идет не о логике вычислений и не об ошибках алгоритма, а о результатах одной и той же простейшей операции с технической точки зрения. Мои опыты показали, при падении объема скрипта до уровня примерно 50К-60К (просто за счет физического убирания нескольких процедур, при оставлении неизменным содержимого сбойной операции), все становится идеально.<br />То, что QLua в плане своей "аппаратной" (назовем так) реализации существенно отличается от того же Lua for Windows, - это уже и проверенный, и доказанный не только мною факт. Зачем опровергать очеивдное? <br />
			<i>16.04.2018 15:10:52, Andrei2016.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30568/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30568/topic3590/</guid>
			<pubDate>Mon, 16 Apr 2018 15:10:52 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30541/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_YTykS0M8" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br />проверяется элементарно через message(&quot;x= &quot;..x..&quot; &nbsp;y= &quot;..y..&quot; &nbsp;z= &quot;..z..&quot; &nbsp;param= &quot;..param). Можете убедиться сами.<br />=============<br />Проверил. &nbsp;При переводе числа в строку Lua по умолчанию округляет до 14 знаков (ну и отбрасывает хвостовые нули, формат &quot;%.14g&quot;). &nbsp;Однако в double знаков, имеющих значение - 17. &nbsp;Поэтому то, что в выдаче message() вы видите как &quot;целое&quot; число, на самом деле таковым может и не являться. &nbsp;Можете поверить:<br />
====code====
<pre>local x = 1.000000000000007
if x ~= 1 then
&nbsp;&nbsp; message("x="..x..", real x="..string.format("%.17g", x))
end
</pre>
=============
Сообщение будет выведено, ибо x не равен 1. &nbsp;Но в самом сообщении в &quot;элементарной&quot; его части будет написано, что равен (в правильной - реальное значение, которое не равно и исходному, ибо оно не представимо точно). &nbsp;Вооружившись этим знанием, перепроверьте все ваши скрипты по 300K - возможно, найдете и другие заблуждения, и вторая проблема тоже уйдет ;) (я с ней помочь не смогу (думаю, что и другие тоже), но стою на своем: ошибка у вас, не в Lua - и вам только кажется, что факт запуска Lua под Quik что-то меняет в плане корректности выполнения). <br />
			<i>15.04.2018 23:32:06, kroki.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30541/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30541/topic3590/</guid>
			<pubDate>Sun, 15 Apr 2018 23:32:06 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30538/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			kroki, <br />проверяется элементарно через message("x= "..x.." &nbsp;y= "..y.." &nbsp;z= "..z.." &nbsp;param= "..param). Можете убедиться сами.<br />Речь идет не о сложном или простом коде. Речь идет о том, что происходит одно и то же присваивание результата от оперирования целочисленными значениями три раза: дважды результат - целочисленный, а на третий раз - с плавающей точкой. Вопрос: каким образом это происходит? Повторюсь: нет никаких сторонних операндов или странных преобразований.<br /><br />Относительно повышения ошибочности скрипта при превышении определенного объема.<br />К сожалению, не правы вы. Самая простая вещь: присвоение значения элементу таблицы и затем адресация при скрипте , скажем в 30К работает как и должно. При скрипте объемом 300К вы начинаете получать ошибку ровно в том же самом месте. Я это уже проходил, и даже писал об этом на форуме.<br />При этом заметьте: я веду речь не просто о stand-alone Lua, а именно о трансляции скрипта под управлением QUIK. <br />
			<i>15.04.2018 22:00:03, Andrei2016.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30538/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30538/topic3590/</guid>
			<pubDate>Sun, 15 Apr 2018 22:00:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30537/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_HzVs63OZ" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br />поправлю, в ±2^53, если быть более точным<br />=============<br />Точно, 52+1. &nbsp;И &quot;гипот<B>е</B>за&quot; через &quot;е&quot; (и может что еще).<br /><br />А ведь мог бы сказать, что &quot;у меня было все правильно, но в браузере ошибка, и при передаче текста он...&quot; :) <br />
			<i>15.04.2018 20:43:40, kroki.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30537/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30537/topic3590/</guid>
			<pubDate>Sun, 15 Apr 2018 20:43:40 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30536/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_iwASqTIR" href="/user/9815/" bx-tooltip-user-id="9815">kroki</a> написал:<br />если результат влезает в +-2^54<br />=============<br />поправлю, в ±2^53, если быть более точным <br />
			<i>15.04.2018 20:14:40, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30536/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30536/topic3590/</guid>
			<pubDate>Sun, 15 Apr 2018 20:14:40 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30533/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			^ что-то пошло не так (видимо, слеш в конце цитаты), жалко, что нет возможности редактировать посты.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_n4TMWIt0" href="/user/47/" bx-tooltip-user-id="47"><noindex><a href="mailto:s_mike@rambler.ru" target="_blank" rel="nofollow">s_mike@rambler.ru</a></noindex></a> написал:<br />умножение и деление, не говоря уже о всяких корнях, в большинстве случаев уже даст накопившуюся ошибку.<br />=============<br />Умножение целого на целое ошибки не даст (опять же, если результат влезает в +-2^54, как вы правильно заметили). &nbsp;Я думаю, что <a class="blog-p-user-name" id="bp_1uIeWY3m" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> просто ошибается либо в том, что на входе в x = (y-z)*param у него целые, либо в том, что на выходе не целое. &nbsp;Это вообще типично: приходит человек, и делает утверждение, &quot;Я написал скрипт, и абсолютно уверен, что он правильный. &nbsp;А результат - неверный! &nbsp;Скажите, это что не работает: Lua, Quik, или компьютер?&quot;<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_hhpWT3Wg" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br />По моим исследованиям, как только скрипт (основной плюс подключаемые через dofile), превышает суммарно некоторый объем, при выполнении скрипта начинаются какие-то совершенно несуразные ошибки.<br /><br />В этой связи, хочу еще спросить у разработчиков: какой суммарный объем скрипта в килобайтах обеспечивает безошибочную работу в рамках терминала QUIK? То, что есть предел определенный - несомненно.<br />=============<br />Предлагаю рассмотреть другую гипотизу: вы пишите небольшой скрипт, делаете небольшое количество ошибок, все более-менее работает. &nbsp;Вы пишите большой скрипт, делаете большое количество ошибок - все перестает работать. &nbsp;Уверенность в отсутствии ошибок в собственном коде - основная помеха их исправлению... <br />
			<i>15.04.2018 17:53:38, kroki.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30533/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30533/topic3590/</guid>
			<pubDate>Sun, 15 Apr 2018 17:53:38 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30532/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_qJI1cPNS" href="/user/2600/" bx-tooltip-user-id="2600">
====quote====
<a class="blog-p-user-name" id="bp_gdmkJtZ1" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:
Т.е., пишу я, скажем, x = 3. Да, по факту оно хранится как double (допустим, как 3,000000000001). Но для пользователя это трактуется как 3. И если я проведу сравнение (x == 3), то получу значение true, а не false, как было бы в случае с чистым double/

=============
</a>Из того, что вы пишите, видно, что вы заблуждаетесь (про связь размера скрипта и точности вычислений - вообще нонсенс). &nbsp;Но чтобы вам это объяснить нужно, чтобы вы сначала показали конктерные цифры, с которыми вы оперировали, и как именно вы определяли, что в последнем x - double, а не &quot;integer&quot;. <br />
			<i>15.04.2018 17:13:02, kroki.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30532/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30532/topic3590/</guid>
			<pubDate>Sun, 15 Apr 2018 17:13:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30531/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Можно руководствоваться следующими принципами.<br /><br />Присваивание всегда делается точно. <br /><br />i = 3<br />i == 3 после этого всегда даст true<br /><br />арифметика плюс/минус между целыми числами, хранчщимтся в формате double, в 99.99 случаях даст целое, если сумма не представится большим числом, в котором будет переполнение мантиссы.<br /><br />умножение и деление, не говоря уже о всяких корнях, в большинстве случаев уже даст накопившуюся ошибку. <br />
			<i>15.04.2018 17:10:03, s_mike@rambler.ru.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30531/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30531/topic3590/</guid>
			<pubDate>Sun, 15 Apr 2018 17:10:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30530/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Михаил, это понятно. Относительно операций, где присутствует, хотя бы теоретическая возможность генерации результата типа double, у меня нет никаких вопросов. Но в описании Lua, в частности, самого Р.Иерусалимски, указано, что условно для пользователя тип конкретной переменной определяется значением, присваиваемым "на лету".<br />Т.е., пишу я, скажем, x = 3. Да, по факту оно хранится как double (допустим, как 3,000000000001). Но для пользователя это трактуется как 3. И если я проведу сравнение (x == 3), то получу значение true, а не false, как было бы в случае с чистым double/<br />Если исходить из того, что "условно целочисленное представление" не работает в большинстве случаев с присваиванием чистых значений integer, то тогда вся арифметика, мобильность и логические отношения в Lua летят вверх тормашками.<br /><br />У меня есть очень сильное подозрение, по аналогии с целым рядом других ситуаций, что эффект, подобный описанному мною, получается из-за ориентированности терминала QUIK на нормальную работу скриптов небольшого размера. Возможно, проблема в накоплении каких-то погрешностей, где-то, может быть, запоздал вызов сборшика мусора. Вобщем, что-то тут есть.<br />По моим исследованиям, как только скрипт (основной плюс подключаемые через dofile), превышает суммарно некоторый объем, при выполнении скрипта начинаются какие-то совершенно несуразные ошибки.<br /><br />В этой связи, хочу еще спросить у разработчиков: какой суммарный объем скрипта в килобайтах обеспечивает безошибочную работу в рамках терминала QUIK? То, что есть предел определенный - несомненно. Хотелось бы его узнать поточнее.<br />А также еще вопрос: с какой периодичностью при выполнении скрипта QUIKв фоновом режиме запускает сборщик мусора? <br />
			<i>15.04.2018 16:34:03, Andrei2016.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30530/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30530/topic3590/</guid>
			<pubDate>Sun, 15 Apr 2018 16:34:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30528/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Андрей.<br /><br />в луа нет типа integer. Тип значения number плавающий с точкой. <br />
			<i>15.04.2018 07:52:09, s_mike@rambler.ru.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30528/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30528/topic3590/</guid>
			<pubDate>Sun, 15 Apr 2018 07:52:09 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Странная типизация результата</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30525/topic3590/">Странная типизация результата</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Возник очень любопытный и очень неприятный эффект. Суть в следующем.<br />Запускаю один единственный скрипт, открыт один график, открыт один источник данных. Сессия закрыта, помех связи нет. Дальше самое интересное.<br />Есть функция, назовем ее func() такого вида:<br /><br />local function func()<br />local x, y, z, param<br />-- Присваиваются значения переменным y, z, param. Все значения - целочисленные (integer).<br />x = (y-z)*param &nbsp;-- результат в x тоже целочисленный<br />-- некоторые действия, которые не изменяют значений всех четырех переменных<br />-- Вторично присваиваются значения переменным y, z, param. Все значения - целочисленные (integer).<br />x = (y-z)*param &nbsp;-- снова результат в x тоже целочисленный<br />-- некоторые действия, которые не изменяют значений всех четырех переменных<br />-- Снова (уже в третий раз) присваиваются значения переменным y, z, param. Все значения - целочисленные (integer).<br />x = (y-z)*param &nbsp;<br />-- результат в x оказывается числом с плавающей точкой (double). Ошибка в расчетах!<br />end<br /><br />Эффект проявился впервые. В документации по Lua сказано, что интерпретатор знает, какой должен быть тип у результата арифметической операции, в зависимости от операнда. Здесь же получается, что все операнды - целочисленные, но результат или получается или остается типа double.<br />Сооружать костыли в виде постоянного использования math.floor как-то не хочется.<br />Есть ли у кого помимо разработчиков какие-то соображения, почему такое могло случиться? Были ли у кого подобные "фокусы".<br /><br />PS.<br />Была бы в Lua четкая типизация данных, такого эффекта не могло бы быть в принципе.<br />Жаль, что все идет в виде union. <br />
			<i>14.04.2018 22:44:31, Andrei2016.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30525/topic3590/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30525/topic3590/</guid>
			<pubDate>Sat, 14 Apr 2018 22:44:31 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
