<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Mikrotik.moscow [тема: Тип данных FLOAT]</title>
		<link>http://mikrotik.moscow</link>
		<description>Новое в теме Тип данных FLOAT форума RouterOS на сайте Mikrotik.moscow [mikrotik.moscow]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Wed, 15 Jul 2026 01:27:22 -0400</pubDate>
		<item>
			<title>Тип данных FLOAT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427370">Тип данных FLOAT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			search tag # rextended ieee754toint IEEE754 DWORD FLOAT в число Функции для преобразования DWORD FLOAT формата IEEE754 в число Эта функция не завершена. RouterOS не поддерживает числа больше 9223372036854775807 или меньше -9223372036854775808, а также не умеет делать десятичное деление. Поэтому получается только приближение, потому что тип float варьируется от (+/-)0,(поставьте здесь 45 нулей)140129846432481707092372958328991613128026194187651577175706<WBR/>&shy;828388979108268586060148663818836212158203125 до (+/-)340282346638528859811704183484516925440, и его невозможно корректно представить в RouterOS. Поэтому эта функция в крайних случаях может выдавать неверное значение.<br /><br />:global ieee754toint do={<br /> &nbsp; &nbsp;:local input [:tonum "$1"]<br /> &nbsp; &nbsp;:local hack 0x3B9ACA00 ; # Хак, RouterOS не поддерживает десятичные числа...<br /> &nbsp; &nbsp;:local isneg ($input &gt;&gt; 31)<br /> &nbsp; &nbsp;:local exponent (($input &gt;&gt; 23) & 0xFF)<br /> &nbsp; &nbsp;:local powerof2 1<br /> &nbsp; &nbsp;:for x from=1 to=($exponent - 0x7F) step=1 do={:set powerof2 ($powerof2 * 2)}<br /> &nbsp; &nbsp;:set exponent $powerof2<br /> &nbsp; &nbsp;:local mantissa ($input & 0x7FFFFF)<br /> &nbsp; &nbsp;:set powerof2 $hack<br /> &nbsp; &nbsp;:local temp $hack<br /> &nbsp; &nbsp;:for x from=22 to=5 step=-1 do={ ; # 5, а не 0, потому что нет поддержки десятичных чисел в RouterOS<br /> &nbsp; &nbsp; &nbsp; &nbsp;:set powerof2 ($powerof2 / 2)<br /> &nbsp; &nbsp; &nbsp; &nbsp;:if ((($mantissa &gt;&gt; $x) & 1) = 1) do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:set temp ($temp + $powerof2)<br /> &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp;}<br /> &nbsp; &nbsp;:set mantissa $temp<br /> &nbsp; &nbsp;:local total (($exponent * $mantissa) / $hack)<br /> &nbsp; &nbsp;:local decimal (($exponent * $mantissa) % $hack)<br /> &nbsp; &nbsp;:if ($decimal &gt; 444444444) do={:set total ($total +1)}<br /> &nbsp; &nbsp;:if ($isneg = 1) do={:set total ($total * -1)}<br /> &nbsp; &nbsp;:return $total<br />}<br /><br />{<br /> &nbsp; &nbsp;:local output {18630;49152} ; # имитируем чтение a = 18630 = 0x48C6 b = 49152 = 0xC000 (a * 0x10000) + b = (0x48C6 * 0x10000) + 0xC000 = 0x48C60000 + 0xC000 = 0x48C6C000 = 1220984832<br /> &nbsp; &nbsp;:local fullvalue ((($output-&gt;0) * 0x10000) + ($output-&gt;1))<br /> &nbsp; &nbsp;:set fullvalue [$ieee754toint $fullvalue]<br /> &nbsp; &nbsp;:local intmw ($fullvalue / 1000)<br /> &nbsp; &nbsp;:local decmw "00$($fullvalue % 1000)" ;<br /> &nbsp; &nbsp;:set decmw [:pick $decmw ([:len $decmw] - 3) [:len $decmw]]<br /> &nbsp; &nbsp;:put "$intmw,$decmw mW"<br />}<br /><br />407,040 mW<br /><br />Далее преобразуем 407040,0 в его исходное значение: 407040,0 / 1000 = 407,040 mW <br />
			<i>03.04.2023 21:24:00, rextended.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427370</link>
			<guid>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427370</guid>
			<pubDate>Mon, 03 Apr 2023 21:24:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Тип данных FLOAT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427369">Тип данных FLOAT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			0x48C6C000 из IEEE 754 в десятичное — это 407040, скорее всего это 407,04 мВт (почему V???). 402944 — это 0x48c4c000 и, вероятно, 402,944 мВт??? Ну серьёзно, как же преобразовать 18630;49152 в 402944 напрямую на Mikrotik?<br /><br />Шаг 1: преобразовать значение из массива целых чисел в одно шестнадцатеричное значение.<br /><br />{<br />:local output {18630;49152} ; # имитация чтения<br /># a = 18630 = 0x48C6<br /># b = 49152 = 0xC000<br /># (a * 0x10000) + b = (0x48C6 * 0x10000) + 0xC000 = 0x48C60000 + 0xC000 = 0x48C6C000 = 1220984832<br />:local fullvalue ((($output-&gt;0) * 0x10000) + ($output-&gt;1))<br />:put $fullvalue<br />} 1220984832 <br />
			<i>03.04.2023 21:24:00, rextended.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427369</link>
			<guid>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427369</guid>
			<pubDate>Mon, 03 Apr 2023 21:24:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Тип данных FLOAT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427368">Тип данных FLOAT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Я новичок в модбасе, так что простите, если объясняю не очень хорошо. К тому же я в первом сообщении написал 80500 неправильно. У меня несколько счётчиков энергии, где каждое значение хранится, согласно инструкции производителя, на 2 регистрах, если использовать таблицу значений IEEE, начиная с 0x1000, или на 4 регистрах, начиная с 0x0000. То есть, чтобы прочитать напряжение системы, я опрашиваю 0x1000 (или 44097) с длиной 2 (или 4 для альтернативной таблицы). Я взял длину 2, потому что думал, что так проще. С помощью Mikrotik я получил такой результат: 18630;49152. Эти значения в шестнадцатеричном формате — 0x48C6;0xC000. Если объединить 0x48C6C000 и преобразовать через конвертер IEEE 754 в десятичное число, получится 402,944, что по инструкции соответствует милливаттам или 402,9 В. Так вот, блин, как мне преобразовать 18630;49152 сразу в 402944 прямо на Mikrotik? <br />
			<i>03.04.2023 13:50:00, kreload.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427368</link>
			<guid>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427368</guid>
			<pubDate>Mon, 03 Apr 2023 13:50:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Тип данных FLOAT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427367">Тип данных FLOAT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Тебе ещё нужно знать порядок байтов, например, big endian или little endian, чтобы что-то вообще конвертировать. <br />
			<i>31.03.2023 21:01:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427367</link>
			<guid>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427367</guid>
			<pubDate>Fri, 31 Mar 2023 21:01:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Тип данных FLOAT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427366">Тип данных FLOAT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Думаю, до модбас float to string можно добраться через скрипт. Но есть проблема: ты НИКОГДА не сможешь сравнивать их или делать с ними математические операции, если не преобразуешь в целые числа — ведь настоящих float просто нет. Так что важно, что именно ты хочешь сделать с этими float. <br />
			<i>31.03.2023 14:25:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427366</link>
			<guid>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427366</guid>
			<pubDate>Fri, 31 Mar 2023 14:25:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Тип данных FLOAT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427365">Тип данных FLOAT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Я не понимаю, что вы имеете в виду. Приведите пример с одним значением и соответствующим ему истинным значением. 2 слова = 2 разных DWORD в одном массиве? 80500 = ? 31200 = ? <br />
			<i>31.03.2023 14:21:00, rextended.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427365</link>
			<guid>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427365</guid>
			<pubDate>Fri, 31 Mar 2023 14:21:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Тип данных FLOAT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427364">Тип данных FLOAT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Есть ли скрипт для 32-битного float, который будет работать с датчиками, где значение основано на длине в 2 слова? Пример: {:local output [/iot modbus read-holding-registers slave-id=0x21 num-regs=0x2 reg-addr=0x1000 as-value once]; :put [($output-&gt;“values”)]} 80500;31200 <br />
			<i>31.03.2023 11:35:00, kreload.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427364</link>
			<guid>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427364</guid>
			<pubDate>Fri, 31 Mar 2023 11:35:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Тип данных FLOAT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427363">Тип данных FLOAT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Спасибо за информацию, но это уже «другая» проблема. В случае с оригинальным постом мы имеем HEX Float значение, которое нужно преобразовать в десятичное (строку). В твоём случае у тебя целое число, которое, как я понимаю, в 10 раз больше значения??? И ты хочешь преобразовать его в float (строку)??? Не совсем понятно, как использовать этот фрагмент, потому что он вырван из контекста, где применяется. <br />
			<i>13.07.2022 09:21:00, rextended.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427363</link>
			<guid>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427363</guid>
			<pubDate>Wed, 13 Jul 2022 09:21:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Тип данных FLOAT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427362">Тип данных FLOAT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Спасибо за это. У меня была похожая проблема при попытке отправить число с плавающей запятой через MQTT с интерфейса LTE1. Вот моё «примитивное» решение:<br /><br />:if ($rsrqLen &gt; 2) do {<br /> &nbsp; &nbsp;:set $intpart ($rsrq/10)<br /> &nbsp; &nbsp;:set $decpart ($rsrq%10*-1)<br /> &nbsp; &nbsp;:set $rsrqvalue ($intpart . "." . $decpart)<br />} else={<br /> &nbsp; &nbsp;:set $rsrqvalue $rsrq<br />} <br />
			<i>13.07.2022 08:08:00, germarsh.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427362</link>
			<guid>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427362</guid>
			<pubDate>Wed, 13 Jul 2022 08:08:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Тип данных FLOAT</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427361">Тип данных FLOAT</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Я пытаюсь декодировать значение температуры с Bluetooth-метки TG-BT5-OUT. Шестнадцатеричное значение (знаковое) — 0x19a1. Реальная температура получается (0x19a1)/256 = 25,6 градусов Цельсия. Я хочу отправить точное значение температуры напрямую в тело MQTT-сообщения. Насколько я вижу, для таких операций доступна только функция TONUM(), но она работает только с целыми числами, и тогда будет указано 26 градусов. Есть ли у кого-нибудь идеи или какой-нибудь приём, чтобы имитировать функцию TOFLOAT()? <br />
			<i>18.05.2022 11:19:00, kp3928.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427361</link>
			<guid>http://mikrotik.moscow/forum/forum57/88486-tip-dannykh-float/message427361</guid>
			<pubDate>Wed, 18 May 2022 11:19:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
	</channel>
</rss>
