|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
||||||||||||||||||||||||||||||||||||
Непредсказуемые изменения точности расчётов внутри kernel10.04.2024, 00:29. Показов 3735. Ответов 45
Метки нет (Все метки)
Всем доброго времени суток!
Не так много времени прошло, но я снова вынужден обратиться за помощью к сообществу. Не по теме: Ну, тут правда то ли я тупой, то ли лыжи не едут. Я ДВА ДНЯ потратил на отладку, чтобы узнать, что проблема ни разу не в моих алгоритмах - просто OpenCL'ю иногда хочется посчитать 9 знаков после запятой, а не 15. Прошу прощения. Смотрите, есть простая программа по вычислению длины отрезка дуги на поверхности сферы:
Поясняю. Вот код управляющей программы (Qt 5, CUDA 12.4, OpenCL 3.0 (auto)): Кликните здесь для просмотра всего текста
и код файла CalcDist.cl: Кликните здесь для просмотра всего текста
Если просто запустить эту программу и сравнить значения дистанции, то мы увидим
Главная причина этого в том, что значение переменной p2 оказывается таким:
Однако, если мы после основного расчёта (внутри kernel) дистанции продублируем его, разделив расчёт переменной p2 на три отдельных операции, то, О ЧУДО, вывод окажется следующим:
Не по теме: Какие-то приколы из мира Arduino, чесслово Я думал, что нашёл проблему, и заменил старые одношаговые секции кода новыми - многошаговыми. КАК же я был удивлён, когда на выходе снова получил восемь несчастных корректных знаков после запятой из 15. Отсюда и сам мой вопрос - а что, собственно, происходит? Почему, я даже не знаю, как это правильно назвать, видеокарта не хочет с первого раза нормально считать? Почему корректный расчёт происходит только при избыточном дублировании? На всякий случай, прикладываю полный консольный вывод приведённой выше программы:
Не по теме: За помощь с перевоспитанием сумасбродной видеокарты, судя по всему
0
|
||||||||||||||||||||||||||||||||||||
| 10.04.2024, 00:29 | |
|
Ответы с готовыми решениями:
45
Повышение точности расчетов Повышение точности расчетов в Matlab Уменьшение точности расчетов (округление) |
|
|
|||
| 23.04.2024, 14:09 | |||
|
https://openwall.info/wiki/john/development/AMD-IL
2
|
|||
|
|
||||||||||||
| 23.04.2024, 23:41 | ||||||||||||
: У меня новые данные к табличке:
0
|
||||||||||||
|
194 / 29 / 5
Регистрация: 11.04.2015
Сообщений: 735
|
||||
| 24.04.2024, 00:48 [ТС] | ||||
Тем не менее, всё указывает на то, что я запускаю kernel не так, поэтому почему мои опции компиляции игнорируются - всё ещё загадка.QGIS'ом, который использует GDAL для расчётов, спорить, я полагаю, бесполезно, а в остальном - наши данные сходятся в рамках использования различных формул для вычисления длины ортодромии. Я-то использую частный случай формулы Винсенти для эллипсоида, у которого большая и малая полуоси совпадают и равны среднему радиусу Земли; формулы брал отсюда. Это уникальный случай - википедия не только не наврала, но и стала-таки энциклопедией, когда других источников я в своё время не нашёл.Кстати, интересно, что делфи либо применяет какие-то лишние оптимизации к варианту x64, либо влияние x87 действительно очень велико. Вариант, посчитанный для Win64, получается удивительно грубым для такой маленькой формулы.
0
|
||||
|
|
|||
| 24.04.2024, 11:40 | |||
![]() В текущей формуле сферы мы лишь можем подобрать чуть больший радиус на 55 параллели, например, я встречал такой радиус 6378137 м
0
|
|||
|
827 / 244 / 47
Регистрация: 24.01.2013
Сообщений: 750
|
|
| 24.04.2024, 19:05 | |
|
Короче не поленился и просчитал сам и кажется понял почему такой разброс результатов.
![]() Сначала посчитал в MS Visual C++, результат как у snake32 = 0,13426110400812105. Надо отдать должное компилятору - никакой разницы как записывать функцию нет, в одну строку или с промежуточными переменными, и даже debug/release на результат не влияют. Потом взял обычный виндовый калькулятор и просчитал в нем (там вроде 32 цифры после запятой, но надо их проверить?). Результат = 0,11111110745692463905484496187387. Не знаю на сколько он точен, но в процессе ручного счета увидел что арккосинус берется от числа 0,99999999999999984792607679235729, а оно отличается от единицы всего в 16-й цифре, т.е. для типа double это на грани фола. И последующий разброс результатов уже зависит от компилятора и девайся, кто как это разрулит. В общем для достижения большей точности нужен тип данных шире чем double иначе никак.
1
|
|
|
|
|
| 25.04.2024, 13:08 | |
|
Нашёл длинную арифметику использующую несколько ячеек флоата/дабла под одну цифру
https://www.davidhbailey.com/dhbpapers/qd.pdf Прочитал по диагонали... надо пробовать... ![]() Добавлено через 3 минуты https://github.com/scibuilder/... /qd_real.h
0
|
|
| 25.04.2024, 13:08 | |
|
Построить график изменения вероятности нахождения в состояниях со временем (по результатам расчетов)
Непредсказуемые синие экраны Stripos - непредсказуемые результаты Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|