Invalid floating point operation как исправить

от admin

Ошибка «Invalid floating point operation» при подключении к 1С 8.3

Данная ошибка может возникать при выполнении узлов импорта из 1С или при тестировании настроенного подключения. Диагностируется при интеграции с платформой 1С версии 8.3.10, использующей серверную архитектуру.

В случае если сценарий импорта из 1С выполняется интерактивно в интерфейсе DStudio, решение для данной ошибки следующее:

  1. Открыть в текстовом редакторе файл сценария (расширение «ded»);
  2. Найти раздел «EnvironmentVariables» и в описании переменной «DisableFloatExceptions» добавить строку <Value>1</Value> :
  3. Сохранить файл сценария.

Значение переменной «DisableFloatExceptions» при правильной правке сценария отразится в настройках Deductor (Рис. 2)

Рисунок 2 – Отображение изменений в настройках

Важно: При изменении и последующем сохранении сценария в DStudio данные изменения могут быть утеряны.

В случае если сценарий используется в пакетном режиме, решение следующее:

Необходимо использовать управляющий сценарий, в котором при помощи узла «Команда ОС» запускать на выполнение DStudio.exe с параметрами запуска сценария импорта из 1С. При этом сам сценарий импорта из 1С править вышеописанным способом не надо, значение переменной DisableFloatExceptions можно передавать в параметрах запуска сценария. В узле «Команда ОС» строка запуска будет примерно такой:

Важно: Необходимо обратить внимание, что при изменении значения переменной DisableFloatExceptions результат работы узла Калькулятор может поменяться, а именно меняется результат обработки значения NULL. Пример: при DisableFloatExceptions = True значение выражения Round(Null()) > 1 возвращает False . При DisableFloatExceptions = False это выражение возвращает Null . В связи с этим, при применении данного решения необходимо проверить работу сценария.

Invalid Floating Point Operation

Чем можно объяснить тот факт, что выполняя один и тот же код, программа без объяснения причин то работает нормально, то выдаёт ошибку «Invalid Floating Point Operation»?

В результате программа периодически остаётся без одного параметра double, что приводит к её некоректной работе.

Как с этим бороться?

6 ответов

Код — это, конечно, хорошо. С кодом, оно, конечно, проще. Только код разбросан по файлам.

Ошибку выкидывало тут:

Сейчас немного поправил код (методом Н.Тыка). Пока ошибка не выскакивает. Поглядим на процесс обкатки.

Originally posted by Пётр . ович
Код — это, конечно, хорошо. С кодом, оно, конечно, проще. Только код разбросан по файлам.

Ошибку выкидывало тут:

Сейчас немного поправил код (методом Н.Тыка). Пока ошибка не выскакивает. Поглядим на процесс обкатки.

У тебя, в твоем разбросанном коде гдето или выполняется конвертация строки в число или присвоение значения, и при этом не выполняется проверка на региональные установки. Т.е. вместо точки стоит запятая, или наоборот. Например, если региональные установки русские, этот код скорее всего сгенерит исключение:

Забавно, когда региональные настрйки в течении нескольких секунд меняются. Хотя за код спасибо.
Самое интересное в том, что в разбросанном коде ошибка выскакивает в цикле. То есть, два раза цикл проходит нормально, а на третий лепит ошибку.

Впрочем, машина не может ошибаться. Ошибается всегда человек.

З.Ы. «Чайником» быть не постыдно. Постыдно быть «чайником» и корчить из себя профи.

Originally posted by Пётр . ович
Забавно, когда региональные настрйки в течении нескольких секунд меняются. Хотя за код спасибо.
Самое интересное в том, что в разбросанном коде ошибка выскакивает в цикле. То есть, два раза цикл проходит нормально, а на третий лепит ошибку.

Впрочем, машина не может ошибаться. Ошибается всегда человек.

З.Ы. «Чайником» быть не постыдно. Постыдно быть «чайником» и корчить из себя профи.

глубокая мысль. Жаль поистягалась и поистерлась от употребления к месту и не к месту. В данном случае не к месту. Сообщения об ошибках надо читать. Они для того и пишутся.

А насчет цикла — проще всего установить точку останова и проверить — какое именно действие и в какой момент генерирует исключение. Зачастую это гораздо быстрее чем рассуждать о том чем не стыдно быть.

Originally posted by kot_
глубокая мысль. Жаль поистягалась и поистерлась от употребления к месту и не к месту. В данном случае не к месту. Сообщения об ошибках надо читать. Они для того и пишутся.

А насчет цикла — проще всего установить точку останова и проверить — какое именно действие и в какой момент генерирует исключение. Зачастую это гораздо быстрее чем рассуждать о том чем не стыдно быть.

Я хоть и чайник, но не идиот. Обнаружение момента исключения ничем мне не помогло.

12. Ошибки при выполнении программы. Опции компилятора

Умея пользоваться массивами, условными операторами и операторами цикла, вы можете писать довольно серьезные программы. При выполнении этих программ неизбежно будут возникать критические ошибки, приводящие к аварийному завершению программы. Такие ошибки по английски называются Run-time errors — ошибки времени выполнения. Рассмотрим пока только наиболее часто встречающиеся арифметические ошибки:

Division by zero — код ошибки 200;

Arithmetic overflow — код ошибки 215;

Range check error — код ошибки 201;

Floating point overflow — код ошибки 205;

Invalid floating point operation — код ошибки 207.

Ошибка Division by zero — деление на ноль — возникает при выполнении операций DIV, MOD и /, когда делитель равен нулю.

Читать:
Чем открывать pdf файлы в windows 10

Ошибка Arithmetic overflow — целочисленное переполнение — возникает при выполнении арифметической операции над целыми числами, когда результат операции выходит за границы соответствующего типа. Такая ошибка произойдет, например, при выполнении программы

VAR a,b : Word; c : Integer; BEGIN a:=100; b:=200; c:=a-b; END.

Ошибка произошла, когда вычислилось значение выражения a-b, равное -100. Мы знаем, что при выполнении операции над операндами типа Word результат будет иметь тип Word, а -100 не является допустимым значением этого типа. То обстоятельство, что это значение мы собирались присвоить переменной типа Integer, не имеет значения, т.к. ошибка произошла до присваивания. Интересно, что, если описать a и b как Byte, то ошибки не будет (см. таблицу 2 в главе 5).

Ошибка Range check error — ошибка проверки диапазона — происходит в двух случаях. Во-первых, при попытке присвоить целочисленной переменной недопустимое значение, и, во-вторых, при использовании недопустимого индексного выражения для элемента любого массива. Проиллюстрируем оба эти случая на простых примерах.

VAR a,b,c : Word; BEGIN a:=$FFFF; b:=1; c:=a+b; END.

Мы попытались присвоить переменной типа Word значение 65536, которое не является допустимым для этого типа.

VAR x : ARRAY[2..8] OF Real; i : Byte;

BEGIN FOR i:=8 DOWNTO 1 DO x[i]:=Sqrt(i); END.

Ошибка произошла при обращении к первому элементу массива, который не существует. Фактически этот второй случай полностью аналогичен первому — мы попытались «присвоить» индексу массива, тип которого-2..8, значение 1.

Ошибка Floating point overflow — вещественное переполнение — возникает при выполнении операции над вещественными числами, когда результат операции слишком велик, или при попытке присвоить вещественной переменной слишком большое значение. Когда речь идет о вещественных числах, термин «слишком большое» следует понимать как большое по абсолютной величине — знак числа не имеет значения. Приведем пример программы, содержащей такую ошибку.

VAR r : Real; BEGIN r:=-1E20; r:=Sqr(r); END.

При возведении в квадрат величины r мы получим слишком большое для типа Real число 1E40.

Ошибка Invalid floating point operation возникает в трех случаях:

1) при вычислении корня из отрицательного числа;

2) при вычислении логарифма неположительного числа;

3) при вычислении функций Trunc и Round от слишком большого (по абсолютной величине) вещественного числа. Эта ошибка довольно очевидна, и мы не станем ее иллюстрировать.

Как же должен поступать программист, когда при выполнении его программы возникают ошибки? Прежде всего нужно локализовать ошибку, то есть найти оператор, в котором она произошла. В этом вам может помочь среда Turbo Pascal, если в ней правильно установлены опции компилятора. Опции компилятора позволяют изменять режим компиляции и задаются в подменю Compiler меню Options среды Turbo Pascal. Пока нас будут интересовать лишь пять опций: Range checking, Stack cheking, I/O checking, Overflow checking, Debug information. Если они включены, то настройка среды благоприятна для отладки вашей программы. Если они выключены, то их обязательно следует включить, а еще лучше задать их непосредственно в тексте своей программы. Опции записываются в программе в виде:

Каждой опции соответствует своя буква (эти буквы выделены в подменю Compiler цветом), символ «+» означает включить, а символ «-» — выключить. В программе можно задать одну опцию, например, или несколько опций — . Некоторые опции можно записывать только в самом начале программы, другие могут размещаться в любом ее месте.

Опция Range checking (R) отвечает за контроль ошибок Range check error, Overflow checking (C) — за контроль ошибок Ariphmetic overflow, I/O cheking (I) — за контроль ошибок ввода-вывода. Смысл опции Stack cheking (S) будет объяснен несколько позже, а опция Debug information (D) включает в код программы отладочную информацию, что позволяет среде Turbo Pascal при аварийном завершении программы показать курсором оператор, в котором произошла ошибка. Позаботьтесь, чтобы при отладке программы перед первым ее оператором была строка — это поможет вам найти и устранить все ошибки. Некоторые неопытные программисты выключают эти опции, тогда программа не прерывается при некоторых ошибках, а продолжает выполняться, на этом основании делается вывод, что программа верна. Это самообман — программа выполняется, но выполняется неправильно и никак не сообщает об ошибках.

Выскакивает ошибка "Invalid floating point operation"

Код на Delphi. После запуска ввожу в поле значение для H (с запятой, т.к вещественное число), запускаю сию процедуру. Выскакивает ошибка "Invalid floating point operation". Помогите найти, пожалуйста.

Kromster's user avatar

Ошибка в этой строке:

Потому что не бывает логарифмов отрицательных чисел. После того как вы поправите логику для этой строки, аналогичное произойдёт ещё далее:

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Похожие статьи