На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Ошибка при выполнении FloatToStr
    Имеем q:extended и s:string. При попытке выполнить s:=FloatToStr(q) вылетает "invalid floating point operation". При этом q имеет значение 0.0275. Ничего не понимаю. Пробовал менять значения, скажем на q:=0.1, ошибка все равно вылетает.
      ExpandedWrap disabled
        procedure TForm1.Button1Click(Sender: TObject);
        var q:extended; s:string;
        begin
        q:=0.0275;
        s:=FloatToStr(q);
        Edit1.text:=s;
        end;


      попробуй помеять точку на запятую ?

      Добавлено
      у меня правда и этот вариант работает)
        Цитата RusSun @
        попробуй помеять точку на запятую ?

        Попробовал DecimalSeparator:=',' (и с точкой тоже) - не помогло.
          Не исключено, что ошибка случилась раньше, и в стеке сопроцессора мусор. И стоит проверить перед операцией Get8087CW
            Да, видимо где-то раньше "затесалось" деление 0/0 или операция с неинициализированным вещ.числом (или неумелое использование встроенного asm'а для fpu-вычислений)
              Покопался в SysUtils. Получилась примерно такая цепочка:
              FloatToStr -> SetString -> FloatToText -> FloatToDecimal
              Вот на FloatToDecimal и запинается. С asm'ом у меня не очень, поэтому просто тупо посмотрел на содержимое регистров CPU.
              Цитата MBo @
              И стоит проверить перед операцией Get8087CW

              Спасибо, почитаю хелп только.
                Копаться в FloatToStr бесполезно, т.к. она работает нормально.
                Но специфика fpu-операций x86 такова, что исключения генерятся не на самой инструкции, вызвавшей исключение, а на следующей за ней команде fpu. Поэтому во всех встроенных дельфийских функциях для работы с вещ.числами всегда вставляется пустая fpu-команда fwait, чтобы ошибка генерилась внутри самой функции, а не где-то после ее вызова. Поэтому возможные invalid operation, связанные с неверными аргументами Sqrt, Ln и т.п. должны возникать на самом вызове этих функций. Но когда ты, например, просто делишь два числа x/y, то может возникнуть ошибка деления 0/0, которая проявится не сразу, а на какой-то другой последующей операции с fpu (в твоем случае на вызове FloatToStr, хотя дело вовсе не вней). Подобный случай тут недавно обсуждался
                Сообщение отредактировано: leo -
                  Цитата leo @
                  Копаться в FloatToStr бесполезно,

                  Да, так и получилось.

                  После прочтения одной статьи вставил Set8087CW(Get8087CW or $0100). На несколько проходов хватало. После чего опять появлялась ошибка.
                  Цитата MBo @
                  Не исключено, что ошибка случилась раньше, и в стеке сопроцессора мусор.

                  Точно. В куске кода, выдранном из старой программы, обнаружилась пара инструкций IF, использующих две объявленных, но не инициализированных переменных.

                  Всем спасибо!
                    Я обычно FormatFloat использую для преобразования числа с плавающей точкой в строку. Заодно сразу и кол-во знаков после запятой указать можно.
                    Типа такого:
                    ExpandedWrap disabled
                      s:=FormatFloat('0.00', q);
                      Обычно такие вещи случаются при использовании библиотек с MMX-ом. Например Graphics32. В таких библиотеках обычно пишут, как и после чего переключаться снова на FP.
                        Dimonka
                        это об?
                        ExpandedWrap disabled
                          asm
                            emms
                          end;

                        так обычно сама библиотека и следит
                          Цитата Lumen @
                          Я обычно FormatFloat использую для преобразования числа с плавающей точкой в строку.

                          Хм... А на что можно использовать необычно? Это не сарказм, вопрос в целях повышения повышаемости.
                          Цитата Lumen @
                          ExpandedWrap disabled
                            s:=FormatFloat('0.00', q);

                          Кажись наоборот, формат указывается после переменной.
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0488 ]   [ 16 queries used ]   [ Generated: 18.06.25, 16:03 GMT ]