Здравствуйте.
Народ, столкнулся с проблемой, которая очевидно решена давно, но ответ сам пока не нашел. Есть тег 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);
}
Точность вычислений в скрипте C WinCC
-
- Site Admin
- Posts: 3992
- Joined: Thu Feb 16, 2006 3:25 pm
- Location: Russia
Re: Точность вычислений в скрипте C WinCC
тема о коллизиях при обычном сравнении чисел с одинарной точностью и методах её обхода погибла вместе с официальным форумом
виноваты индусы... вместо простой двоичной выдумавшие десятичную систему счисления
https://support.microsoft.com/ru-ru/hel ... int-errors
Code: Select all
для проверки равенства значения переменной item1=69.82 ?
надо проверять как то так
IF (item1# < 69.83#) AND (item1# > 69.81#)
then print "Equal"
https://support.microsoft.com/ru-ru/hel ... int-errors
https://habrahabr.ru/post/112953/Это объясняет, почему простой пример, следующий...
будет 1.000054 печать на выходе.
Небольшая ошибка представления числа 0,0001 в двоичном формате влияет на сумму.
ночь... рождество... хоть и не наше... но завтра на работу...Очень распространенная ошибка при работе с float-ами возникает при проверке на равенство. Например...