Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
218 / 50 / 52
Регистрация: 15.01.2013
Сообщений: 305

Ошибка при вычислении

16.09.2013, 14:59. Показов 1462. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
    double x,y,z;
    x = StrToFloat(MaskEdit1->Text);
    y = StrToFloat(MaskEdit2->Text);
    z = StrToFloat(MaskEdit3->Text);
    double val[1001];
    int i = 1;
    val[i] = x;
    Memo1->Lines->Add(FloatToStr(val[i]));
    for (;;) {
        i++;
        val[i] = val[i-1] + z;
        Memo1->Lines->Add(FloatToStr(val[i]));
        if (val[i] >= y) {
            break;
        }
    }
}
Задан интервал, и шаг. Считает правильно за исключением, если значение должно быть нулевым. Показано во вложении. Как исправить?
Миниатюры
Ошибка при вычислении  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.09.2013, 14:59
Ответы с готовыми решениями:

Ошибка при вычислении возраста
Вычисляю возраст по дате рождения:Double date; DateTimePicker1->Date = Now(); DateTimePicker2->Date =...

Ошибка в вычислении sqrt()
Почему строит только первую строку? for(y=0; y<8; y++) { for(x=0; x<8; x++) { if(x==0) DCT=1/sqrt(8); if(x!=0)...

Ошибка в вычислении - найти сумму выше главной диагонали
подскажите в чем проблема нужно найти сумму выше главной диагонали ответ получается не верным TForm1 *Form1; int i,j,n; int...

14
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
16.09.2013, 15:26
Замени FloatToStr на FloatToStrF:
C++
1
Memo1->Lines->Add(FloatToStrF(val[i], ffFixed, 5, 2));
, и посмотри, что будет...
0
218 / 50 / 52
Регистрация: 15.01.2013
Сообщений: 305
16.09.2013, 15:35  [ТС]
Не помогло..
Вопрос возник, когда хотел на заданном интервале (-4;4) с шагом 0,1 построить график функции cos(x).
Ошибка выходит именно на нуле. Проект в вложении.
Вложения
Тип файла: rar Графики.rar (7.21 Мб, 15 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
16.09.2013, 16:29
Цитата Сообщение от StrelokCj Посмотреть сообщение
Не помогло..
Правда?

0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.09.2013, 16:54
Цитата Сообщение от StrelokCj Посмотреть сообщение
Не помогло..
А точно пробовал?

Ошибки нет и не было изначально. Значение, которое ты принял за ошибочное, оно верно, так как оно чрезвычайно близко к нулю. А то, что оно нулем не отображается в мемо - это лишь нюанс формата вывода значения и для более адекватного отображения нужно округлять, как и предложил UI.

Почему все так, можешь глянуть здесь - Представление вещественных чисел "на пальцах"
1
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
16.09.2013, 17:26
Т.е. вы хотите сказать, что float и double не могут хранить истинный ноль, а хранят очень близкое к нему значение, которое если не округлять, нулю не равно, так? Тогда почему в этом коде я вижу нули без всяких танцев с FloatToStrF?
C++
1
2
3
4
float a=0.;
Edit1->Text=FloatToStr(a);
a=sin(a);
Edit2->Text=FloatToStr(a);
Я бы сказал, что это проблема не FloatToStr, а точности расчетов.
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.09.2013, 20:07
А кто-то говорил, что проблема в функции FloatToStr()? Кто-то говорил, что вообще есть проблема?

Точность машинной арифметики не абсолютна - это есть. Но проблемы в этом никакой нет.
1
218 / 50 / 52
Регистрация: 15.01.2013
Сообщений: 305
16.09.2013, 20:58  [ТС]
На этот момент я обратил внимание потому что если задавать график f(x) = cos(x) (или sin(x), без разницы) с интервалом (-4;4) с шагом 0,1 то выдает ошибку вычисления cos(~0) и график херится к чертям. Проверил класс, если явно отправить функцию в pars.Compile(cos(0)); то вычисляет без проблем, а вот после заполнения массива x и вычисления значений y именно на нуле выдает исключение. Если задать тот же интервал а шаг взять например 0,3 то все отлично. Тогда я и начал выводить элементы массивов x и y в Memo, чтобы посмотреть что там получается... Поэтому я и решил что проблема в цикле с x[i] элементами...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.09.2013, 22:35
Цитата Сообщение от StrelokCj Посмотреть сообщение
именно на нуле выдает исключение
Думаю, уже можно раскрывать тайну - какое именно исключение?
0
218 / 50 / 52
Регистрация: 15.01.2013
Сообщений: 305
17.09.2013, 15:54  [ТС]
Число ему не нравится, после запятой много цифр. Использовал класс TParser
http://www.rsdn.ru/article/fil... parser.xml

Добавлено через 5 часов 22 минуты
Видимо ошибка в самом классе, только какая интересно. Ведь программа сама как раз таки правильно высчитывает косинус, не смотря на его неверное отображение в Memo.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.09.2013, 17:18
Цитата Сообщение от StrelokCj Посмотреть сообщение
Число ему не нравится, после запятой много цифр.
Что-то не припомню такого текста ошибки, процитируй по-человечески... Неужто исключение EOverflow?
1
218 / 50 / 52
Регистрация: 15.01.2013
Сообщений: 305
17.09.2013, 17:22  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    ::TParser pars;
    for (int j = 1; j <= i; j++) {
        try {
            fx = Edit1->Text;
            fx1 = "x";
            fx2 = FloatToStr(x[j]);
            fx = AnsiReplaceStr(fx,fx1,fx2);
            fx = AnsiReplaceStr(fx,",",".");
            pars.Compile(fx.c_str());
            pars.Evaluate();
            y[j] = pars.GetResult();
        } catch (TError error) {
            ShowMessage(QuotedStr(error.error)+" at position "+IntToStr(error.pos));
        }
    }
На 9 или 10 строке исключение возникает, класс исключений по видимому тоже описан в классе TParser.
Скрины ошибки и графика:
Миниатюры
Ошибка при вычислении   Ошибка при вычислении  
0
218 / 50 / 52
Регистрация: 15.01.2013
Сообщений: 305
17.09.2013, 17:23  [ТС]
Показывает ошибку на 21 позицию в строке fx, хотя там должно быть не более 6-10 символов.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
18.09.2013, 20:38
Цитата Сообщение от StrelokCj Посмотреть сообщение
хотя там должно быть не более 6-10 символов.
Поставь breakpoint и посмотри, сколько там реально символов. Сдается мне, что строчка
C++
1
fx2 = FloatToStr(x[j]);
запихивает в выражение очень много цифр, а парсер этого дела не понимает. Используй FloatToStrF(), как выше и предлагали, или любые функции для предварительного округления.
1
218 / 50 / 52
Регистрация: 15.01.2013
Сообщений: 305
18.09.2013, 22:01  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Поставь breakpoint и посмотри, сколько там реально символов. Сдается мне, что строчка
C++
1
fx2 = FloatToStr(x[j]);
запихивает в выражение очень много цифр, а парсер этого дела не понимает. Используй FloatToStrF(), как выше и предлагали, или любые функции для предварительного округления.
Ок, сейчас попробуем

Добавлено через 4 минуты
Спасибо, помогло)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.09.2013, 22:01
Помогаю со студенческими работами здесь

Ошибка при вычислении
Добрый день, подскажите есть ли функция в аксеес еслиошибка как у экселя?

Ошибка при вычислении
clear all close all clc Ea = 0.15; Eb = 0.15; Ee = 0.1; N = 70;

Не могу понять в чем ошибка при вычислении в Базе данных при составлении Запроса
Всем привет! Нужна ваша помощь! Недавно начал осваивать Access и не знаю всех тонкостей. На работе поставили задачу по созданию...

Ошибка при вычислении вероятности
При вычислении функции pexp параметр выделен красным This array index is invalid for this array.

Ошибка при вычислении выражения
в чем ошибка? program drtdfg; Uses CRT; var x, a, b, f, d, y: real; begin x:=1; a:=3; b:=3; f:=3; d:=3;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru