Page 1 of 1

Точность вычислений в скрипте C WinCC

Posted: Sun Dec 24, 2017 8:46 pm
by volotovskyd
Здравствуйте.

Народ, столкнулся с проблемой, которая очевидно решена давно, но ответ сам пока не нашел. Есть тег 32bit float, значение которого нужно уменьшать на 0.01 при нажатии кнопки. Накропал маленький скрипт. При компиляции редактор предупреждает о некой потере точности, но компилирует. Сразу этому не придал значение, а зря. При нескольких нажатиях на вышеуказанную кнопку в седьмом разряде после запятой вылазит 1 и это позволяет выполниться условию if. Как по уму с этим борются? Я новичек.

Текст скрипта:
#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
float value,minvalue;
value=GetTagFloat("Zad_Am1");
minvalue=GetTagFloat("Fam_min");
if (value>minvalue)
{
value=value-0.01;
SetTagFloat("Zad_Am1",value);
}

Re: Точность вычислений в скрипте C WinCC

Posted: Sun Dec 24, 2017 8:56 pm
by CoMod
тема о коллизиях при обычном сравнении чисел с одинарной точностью и методах её обхода погибла вместе с официальным форумом (h)

Code: Select all

для проверки равенства значения переменной item1=69.82 ? 
надо проверять как то так
IF (item1# < 69.83#) AND (item1# > 69.81#)
    then print "Equal"
виноваты индусы... вместо простой двоичной выдумавшие десятичную систему счисления (boom)
https://support.microsoft.com/ru-ru/hel ... int-errors
Это объясняет, почему простой пример, следующий...
будет 1.000054 печать на выходе.
Небольшая ошибка представления числа 0,0001 в двоичном формате влияет на сумму.
https://habrahabr.ru/post/112953/
Очень распространенная ошибка при работе с float-ами возникает при проверке на равенство. Например...
ночь... рождество... хоть и не наше... но завтра на работу... (thnx)