Comments 14
Penetration ** 2.0 вызывает переполнение
Вы не поверите.. Об этом даже кино сняли! И не одно..
Это при том что проект сдан и находился в эксплуатации довольно давно. Я все же думаю что разработчик тупо везде щелкал вещественные числа без разбора степень это или просто коэффициент. Ну и мало того не задумываясь о том, что нельзя возводить отрицательные числа в действительную степень (я если честно и сам о таком нюансе не предполагал даже).
И в итоге получилось что Penetration ** 2.0 вызывает переполнение, а Penetration * Penetration нет.
Видимо, дело в том, что для отрицательных чисел определено возведение только в целую степень (с точки зрения контроллера), а 2.0 - число пусть и равное целому, но всё-таки с точки зрения производимых операций вещественное, и какой-то из шагов реализации к этому не приспособлен?
Тссссс! Молчите! Сейчас молодой человек откроет для себя дополнительное представление отрицательных чисел...
Как уже сказали - проблема в попытке возведения отрицательного числа в вещественную степень. Дело в том, что обычно она вычисляется по формуле a ^ x = e ^ (x * ln a) , а без перехода в комплексные числа натурального логарифма отрицательного числа не существует.
Функции sqr в этом ПЛК нет?
Спасибо за формулу, теперь стало понятнее! Насчет sqr не в курсе, нужно попробовать. Попробую сделать эксперимент с sqr, и с целой 2, вместо вещественной 2.0
UPD похоже что в контроллере SQR инструкция используется для квадратного корня... Но главное сейчас принцип понятен, почему так, и это уже хорошо))
потому что случай довольно интересный,хотя он описан в школьном учебнике. Нехорошо прогуливать математику! ) А почему тут в показателе степени вообще используется вещественное вместо целого?
Насчет математике совсем зря, чисто математически нет никакой разницы как считать, а вот компьютеру в этом есть разница. Вещественное число решили использовать разработчики, я не в курсе почему так. Полагаю что просто тупо раз везде вещественные коэффициенты, то решили и степень так же записать. Опять же по мне куда проще и понятнее тупо умножение числа само на себя
Благодаря наводке из комментариев, за что очень сильно благодарен комментаторам, я решил все-таки обратиться к мануалу, хотя с этого наверно и стоило начать. В мануале описания для инструкции возведения в квадрат нет, зато есть инструкция для возведения в степень. В блочном виде (Ladder Diagram) это блок XPY (X to the Power of Y), в структурном тексте (ST) как раз и есть та самая инструкция dest := sourceX ** sourceY; И на следующей странице мануала так и пишется If Source X is negative, Source Y must be an integer value or a minor fault will occur.
Арифметическое переполнение в ПЛК AllenBradley