Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Десятичные дроби?

    Десятичные дроби?

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Десятичные дроби?, RouterOS
     
    changeip
    Guest
    #1
    0
    11.06.2008 18:21:00
    Неужели MT не поддерживает десятичные дроби?? [admin@MikroTik] interface> :put (5 / 2) 2 С какого же дня 5 / 2 = 2? Я пытаюсь распарсить координаты GPS и преобразовать их обратно в десятичные. Вот пример скрипта, но дальше продвинуться не могу, потому что математика сломана.

    :global gps [/system gps monitor as-value]

    :put ($gps -> "date-and-time")
    :put ($gps -> "longitude")

    # Парсинг долготы
    :global long1 [:find ($gps -> "longitude") " " 0]
    :global long2 [:find ($gps -> "longitude") " " $long1]
    :global long3 [:find ($gps -> "longitude") "'" $long2]
    :global long4 [:find ($gps -> "longitude") "''" $long3]

    :global degrees [:tonum [:pick ($gps -> "longitude") $long1 $long2 ] ]
    :global minutes [:tonum [:pick ($gps -> "longitude") $long2 $long3 ] ]
    :global seconds [:tonum [:pick ($gps -> "longitude") ($long3 + 2) $long4 ] ]

    :env print

    # Должно вывести десятичную долготу.
    :put ($degrees + ($minutes/60) + ($seconds/3600)) Получаю вот это: “gps”={“date-and-time”=“jun/11/2008 18:19:25”; “longitude”=“W 117 12’ 55’'”; “latitude”=“N 33 13’ 49’'”; “altitude”=“191.399994m”; “speed”=“0.111120 km/h”; “valid”=true} “long1”=1 “long2”=5 “long3”=8 “long4”=12 “degrees”=117 “minutes”=12 “seconds”=55 [master@cip-home] /system gps> :put ($degrees + ($minutes/60) + ($seconds/3600)) 117 Что случилось с моими десятичными?! Если я смогу это заставить работать, у меня есть скрипт, который будет загружать местоположение GPS вашего роутера на серверы GpsGate.com, чтобы вы могли отслеживать местоположение всех GPS-роутеров.
    Сэм
     
     
     
    dssmiktik
    Guest
    #2
    0
    21.07.2009 22:06:00
    Это вычислит точные десятичные значения с любым количеством знаков после запятой. Просто введи делимое, делитель и количество знаков после запятой, и переменная $result будет установлена в ответ. # Выполняет вычисления с десятичными знаками
    # делимое / делитель = частное.десятичные = результат

    :local dividend 3
    :local divisor 11
    :local decimalplaces 3


    # Математическое вычисление здесь
    :local quotient 0
    :local remainder 0
    :local result 0
    :local decimal 0

    :set quotient ($dividend / $divisor)

    :if ($quotient = 0) do={
     :set dividend [:tonum ($dividend . "0")]
    }

    :set remainder ($dividend - ($divisor * $quotient))

    :if ($remainder > 0) do={
     :local tmpremainder [:tonum ($remainder . "0")]
     :for x from=1 to=$decimalplaces do={
       :local tmpdecimal [:tonum ($tmpremainder / $divisor)]
       :set decimal [:tonum ($decimal . $tmpdecimal)]
       :set tmpremainder [:tonum (($tmpremainder - ($tmpdecimal * $divisor)) . "0")]
     }
     :set result ($quotient . "." . $decimal)
    } else={
     :set result $quotient
    }
    # КОНЕЦ Математическое вычисление здесь

    :put ($dividend . " / " . $divisor . " = " . $result) Надеюсь, это поможет.
     
     
     
    Jotne
    Guest
    #3
    0
    30.08.2019 15:17:00
    2019 Это все еще правда? {
    local speed 10
    :put $speed
    :local speedknots ($speed * 5)
    :put $speedknots
    }
    10
    50 {
    local speed 10
    :put $speed
    :local speedknots ($speed * 1.5)
    :put $speedknots
    }
    10
    Script Error: cannot multiply time interval by ip prefix {
    local speed 10
    :put $speed
    :local speedknots ($speed * 1,5)
    :put $speedknots
    }
    10
    10;5
     
     
     
    mrz
    Guest
    #4
    0
    02.09.2019 07:55:00
    Да, только целые числа. Везде, где вы видите десятичное представление, это на самом деле строка.
     
     
     
    Jotne
    Guest
    #5
    0
    02.09.2019 16:43:00
    Да, знаю, но MT мог бы добавить BC или другой Linux-инструмент в скрипт для работы с десятичными числами. Жду v 7.0.
     
     
     
    Jotne
    Guest
    #6
    0
    08.12.2021 10:20:00
    Разочарован. Ничего не изменилось, даже после выхода 7.1.
     
     
     
    mrz
    Guest
    #7
    0
    08.12.2021 12:33:00
    Никто и не обещал, что такое появится в ROSv7.
     
     
     
    msatter
    Guest
    #8
    0
    08.12.2021 12:48:00
    Но у пользователей есть надежда… Я сам умножаю значения на числа вроде 10 или 100 или 1000 и т.д., а потом выполняю расчет. Тогда я вижу количество знаков после запятой, которое я определил с помощью множителя, который использовал раньше. Как это реализовано в модуле MTTQ? Откуда берутся десятичные значения с устройств, если они в норме?
     
     
     
    Amm0
    Guest
    #9
    0
    10.12.2021 05:34:00
    Мне сказали, что обновление ядра даст [:infinity] в v7.∞ где-то – очень разочаровывает. Более сложное решение включает в себя тип ROS’s “ip6” (и :toip6) – там есть 128 бит. Я бы сослался на стандарты интернета IETF здесь. Смотрите RFC8135: Complex Addressing in IPv6 от 1 апреля 2017 года. Видимо, кто-то задумался, что если у тебя есть тип IPv6, но нет типа “с плавающей запятой” / "десятичного" числа – как это обычно бывает в скриптах Mikrotik. Тип ip6 в Mikrotik можно перегрузить, используя идею использования типов IPv6 для чисел с плавающей запятой, поскольку он уже длиннее 128-битного целого числа. "::" может выступать в качестве десятичной точки (что позволяет распарсить и все равно остаться относительно читаемым, будучи в шестнадцатеричном виде с "::" вместо более типичной ".", или ","). Отрицательное число может начинаться с префикса 1000:: (положительное) и 1001:: (отрицательное), которые не маршрутизируются в IPv6 для использования прокси для 1K-дополнения или необходимости побитовой арифметики. Некоторые преобразования в шестнадцатеричный и добавление ":" каждые 4 шестнадцатеричных символа, с :: в качестве разделителя для целой и дробной частей, необходимо для кодирования "десятичного" числа. Некоторые биты будут потеряны в этом подходе. "::" использует 4 для 0x000 "десятичного" разделителя и еще 4 для хранения положительного/отрицательного. Но эти дополнительные биты, "потерянные" в "1K-дополнении", предлагают расширение полного набора RFC8135, подобно мнимым или "птичьим" данным, передаваемым по протоколу от RFC1149. Целая часть хранится в наименее значащих битах, поэтому 1000:8::4 равно +4.1, а 1001:2::8 равно -8.2 – поиск назад в Mikrotik быстро даст вам целую часть таким образом (кажется). Как это теоретически работает, используя тип “ip6” в Mikrotik в качестве прокси для более длинного целого числа: :put [$tofloat 0]
                    1000::
    :put [$tofloat 1.1]
                      1000:1::1
    :put [$tofloat -1.1]
                       1001:1::1
    :put [$tofloat 4343.1344]
                            1000:540::10f7 Обратный процесс выглядит так: :put [$fromfloat [$tofloat 0]]
                                 0.0
    :put [$fromfloat [$tofloat 1.1]]
                                   1.1
    :put [$fromfloat [$tofloat -1.1]]
                                    -1.1
    :put [$fromfloat [$tofloat -123.123]]
                                        -123.123
    :put [$fromfloat [$tofloat 4343.1344]]
    4343.1344 Хотя, конечно, простое умножение на 1000 для проксирования десятичных чисел гораздо проще. Если вам нужны более длинные числа, тип ip6 будет проще, чем попытка использовать массив для хранения частей, я думаю. У меня нет необходимости в числах с плавающей запятой в моем скрипте – "сдвиг целого числа" способом, который предлагает @msattr, вероятно, будет наилучшим. Но почитайте эту тему и вспомните про RFC8135.
     
     
     
    Amm0
    Guest
    #10
    0
    27.12.2021 01:35:00
    Я чистил файлы скриптов и вспомнил, что забыл опубликовать частично рабочую реализацию RFC8135, которая выдает вышеуказанный вывод. В основном, она использует две функции:

    `$tofloat` - преобразует строку в "fakefloat" (тип "ip6" в ROS).
    `$fromfloat` - преобразует переменную, внутренне являющуюся типом "ip6", созданную `$tofloat`, в строку с плавающей/десятичной точкой.

    Пока что здесь НЕТ математических функций, таких как `$ADD` или `$MULTIPLY`.  И `$fromfloat` должен принимать аргумент вроде "round=0", чтобы получить целую часть или усечь десятичную часть.  Планирую выпустить версию 4/1 с этими функциями.  Также использует/адаптирует следующие вспомогательные функции, которые могут быть полезнее как отдельные функции:

    `$tobase`  `base= [1-32, optional]` - используется для преобразования из десятичной системы в шестнадцатеричную (hexstrings).
    `$strip`  `strip=` - используется для удаления двоеточий в IPv6-адресах.

    :global tofloat do={
       :global tobase;
       :local i;
       :local d;
       :local ip6comp 1000
       if ($1~"-") do={
           :set ip6comp 1001
           :set $1 [pick $1 1 99]
       }
       :if ([typeof $1]~("num")) do={
           :set $i $1;
           :set $d 0;
       } else={ :if ([find $1 "."]>0) do={
           :set i [pick $1 0 [find $1 "."]]
           :set d [pick $1 ([find $1 "."]+1) 64]
           } else={:set $i 0; set $d 0;}
       }
       :local ihex [$tobase $i]
       :local dhex [$tobase $d]
       :local float64 [:toip6 "$ip6comp:$dhex::$ihex"]
       #:put "$ihex $dhex $i $d $float64"
       :return $float64
    }

    :global fromfloat do={
       :global strip
       :local float64 [tostr $1]
       :local neg ""
       :if ($float64~"1001.+") do={:set $neg "-"}
       :set $float64 [pick $float64 5 64]
       :local ipart [$strip char=":" [pick $float64 ([find $float64 "::"]+2) 64]]
       :local dpart [$strip char=":" [pick $float64 0 ([find $float64 ":"]+1)]]
       #if ([typeof [tonum $dpart]]!="num") do={set dpart 0}
       #:put "$float64 $neg $ipart $dpart"
       :set ipart [tonum "0x$ipart"]
       :set dpart [tonum "0x$dpart"]
       :local strfloat "$neg$ipart.$dpart"
       #:put "$strfloat $ipart $dpart"
       :return $strfloat
    }

    # adapted from msmater http://forum.mikrotik.com/t/cleaning-characters-from-string-for-use-in-variablename/139391/1
    :global strip do={
       :local a [tostr $1]
       :local b $char
       :if ([typeof $b]="nil") do={:set b "-"}
       :while ([find $a $b]) do={
           :set $a ("$[:pick $a 0 ([find $a $b]) ]"."$[:pick $a ([find $a $b]+1) ([:len $a])]")}
       :return $a
    }


    :global tobase do={
       :local decnum $1
       :local basenum ""

       :if ([typeof $base]="nil") do={:local base 16} else={:local base}
       :if ($base>0 and $base<33) do={} else={:set $base 16}
       :local chrtable [:toarray "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f"]
       :local chrtable ($chrtable + [:toarray "g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"])
       :local basedigits 0
       :local basearray
       :local bw
       :local loop 1
       :while ($loop=1 ) do={
               :set bw 0
               :for c from=0 to=$basedigits step=1 do={
               :set bw ($bw*$base)
               :if ($bw=0) do={:set bw 1}
           }
           :set basearray ($basearray + [:toarray $bw])
           :set bw ($decnum/$bw)
           :if ($bw > 0) do={
               :set basedigits ($basedigits+1)
           } else={
               :set loop 0
               :set basedigits ($basedigits-1)
           }
       }
       :local dn $decnum
       :local bpv
       :for c from=$basedigits to=0 do={
           :set bpv ($dn/[:pick $basearray $c])
           :set dn ($dn-([:pick $basearray $c]*$bpv))
           :set basenum "$basenum$[:pick $chrtable $bpv]"
       }
       :return $basenum
    }

    Если вы сохраните это в маршрутизаторе как файл с именем “fakefloat”, используйте, например:

    :import fakefloat
    :global myfloat [$tofloat -10.1]
    :put [$fromfloat $myfloat]

    # -10.1

    С такими тестами:

    :put  "$([$tobase 1]) $([$tobase 10]) $([$tobase 16]) $([$tobase 16 base=32])"

    :put "stripchar $([$strip char=":" "1:1:1:1" ])"

    :put [$fromfloat [toip6 "1000:1::1"]]
    :put [$fromfloat [toip6 "1001:1::1"]]
    :put [$fromfloat [toip6 "1000:10::10"]]
    :put [$fromfloat [toip6 "1001:10::10"]]
    :put [$fromfloat [:toip6 "1001:03e9::1"]]
    :put [$fromfloat [:toip6 "1001:1::03e9"]]
    :put [$fromfloat [:toip6 "1000:540::10f7"]]

    :put [$tofloat 0]
    :put [$tofloat 1.1]
    :put [$tofloat -1.1]
    :put [$tofloat -123.-123]
    :put [$tofloat 4343.1344]

    :put [$fromfloat [$tofloat 0]]
    :put [$fromfloat [$tofloat 1.1]]
    :put [$fromfloat [$tofloat -1.1]]
    :put [$fromfloat [$tofloat -123.123]]
    :put [$fromfloat [$tofloat 4343.1344]]

    Только протестировано на V7.x
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры