|
10 / 9 / 1
Регистрация: 29.05.2010
Сообщений: 15
|
||||||||||||||||
Ошибка в цикле с переменной double27.06.2010, 14:34. Показов 4894. Ответов 11
Метки нет (Все метки)
Вкратце суть вопроса.
Есть переменные
start=-3 finish=3 tab=0,1 На мой взгляд все казалось ровно и в ListBox2 должно быть примерно следующее -3 -2.9 -2.8 ... -0.2 -0.1 0 0.1 0.2 ... 2.9 3 но получается не совсем так. Как только значение счетчика попадает в интервал от -1 до 1 то вместо 0.9 пишет 0.899999999 и так далее а вместо 0 вообще 1.5265....E -15 Собственно вопрос - как мне получить нормальные числа без длиннющих хвостов и в особенности 0.
0
|
||||||||||||||||
| 27.06.2010, 14:34 | |
|
Ответы с готовыми решениями:
11
Теряется точность переменной типа double |
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
| 27.06.2010, 15:38 | |
|
Ну, одно из решений - округлять числа перед запихиванием.
Ченить типа x = int(x*10^n + 0.5)/10^n, где n - желаемое количество знаков после запятой. (При больших x работать не будет)
0
|
|
|
10 / 9 / 1
Регистрация: 29.05.2010
Сообщений: 15
|
|
| 27.06.2010, 16:35 [ТС] | |
|
числа (х) большими не будут (приблизительно от -50 до 50),
формула правда выкидывает ошибку [C++ Error] Unit1.cpp(109): E2060 Illegal use of floating point я попробовал взять в скобки ch = int(ch*(10^5) + 0.5)/10^5; но в этом случае вообще не округляется. сказать честно мне не принципиально важно будет выдаваться 0.9 или 0.899999999 эти числа нужны для расчетов по тригонометрическим функциям (просто погрешность будет маленькая). мне гораздо важнее знать, а лучше исправить ситуацию с 0. когда прога подходит к нулю (т.е. выполняется действие -0.1 + 0.1 то результатом должен быть 0 а не 1.5265....E -15)
0
|
|
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
| 27.06.2010, 16:46 | |
|
Во-первых, я тебя видимо ввел в заблуждение, ^ в цпп означает ксор, оператора возведения в степень нет, нужна какая-нить функция.
А точность вычислений с плавающей точкой ты просто так не улучшишь. И пусть тебя не пугает 1.5265....E -15, если вдруг ты не понял, это 1.5265 * 10^(-15), то есть почти ноль. Чистого нуля не получается из-за погрешности вычислений. Но если будешь хоть немного округлять результат - будет тебе ноль. Добавлено через 2 минуты Если у тебя выполняются лишь операции +0.1 и -0.1, можешь просто проверять x < 0.001 и явно ставить 0.
1
|
|
|
10 / 9 / 1
Регистрация: 29.05.2010
Сообщений: 15
|
|
| 27.06.2010, 17:03 [ТС] | |
|
спасибо. вроде разобрался. думаю проще будет действительно просто сравнивать х с определенной точностью.
0
|
|
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
| 27.06.2010, 17:07 | |
|
Ну и конечно не x < 0.001, а abs(x) < 0.001, а то мало ли.
0
|
|
|
10 / 9 / 1
Регистрация: 29.05.2010
Сообщений: 15
|
||
| 27.06.2010, 17:47 [ТС] | ||
|
нашел формулу для округления на заданное количество знаков. может полезно кому будет x=floor(x*100)/100; до сотых x=floor(x*1000)/1000; до тысячных, ну и так далее. хотя мне кажется что для очень высокой точности не подойдет (ну если там миллиардные нужно учесть или что-то вроде того). сам округлял до 100000-ных - работает.
0
|
||
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|||
| 27.06.2010, 17:58 | |||
|
Добавлено через 2 минуты Не по теме: Зачем же ж вы ']' в нике используете, вас же цитировать неудобно...
0
|
|||
|
10 / 9 / 1
Регистрация: 29.05.2010
Сообщений: 15
|
|
| 27.06.2010, 22:00 [ТС] | |
|
прошу прощения, про #include <cmath> не знал (очень плохо С знаю
)а по поводу формулы вместо floor можно использовать ceil, тогда округлять будет правильно (для вашего примера с 0.009). если я правильно понял, то тип округления выбирается в зависимости от задачи. в моем случае мне кажется более верным округлять в меньшую сторону.
0
|
|
|
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
|
|
| 27.06.2010, 22:05 | |
|
Короч. floor - это округления вниз, ceil - округление вверх, они оба будут врать, только в разных случаях и в разные стороны. Если хочешь округление по математическим правилам - к ближайшему целому - используй
a = int(x + 0.5); - именно это я использовал выше. int(x) - это целая часть x (или, эквивалентно x округленный вниз) подумай чуть-чуть, поймешь почему это приводит к верному округлению до ближайшего целого.
0
|
|
|
Тутошний я
|
||||||
| 27.06.2010, 23:54 | ||||||
|
такое получилось
0
|
||||||
|
10 / 9 / 1
Регистрация: 29.05.2010
Сообщений: 15
|
|||||||
| 28.06.2010, 15:11 [ТС] | |||||||
![]()
0
|
|||||||
| 28.06.2010, 15:11 | |
|
Помогаю со студенческими работами здесь
12
Как оформить в цикле работу с переменной Ошибка с типами string и double Ошибка Cannot convert 'long double' to 'UnicodeString' Ошибка в переменной типа double Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|