Объявление форума |
Если пользуетесь личными сообщениями и получили по электронной почте оповещение о новом письме, не отвечайте, пожалуйста, почтой. Зайдите на форум и ответьте отправителю через ЛС. |
Полигон-2 » IBM PC-совместимое. До 2000 года включительно » Сопроцессоры 8087 и утилита mcpdiag |
<<Назад Вперед>> | Страницы: 1 2 3 4 5 * 6 7 | Печать |
Fe-Restorator |
Сообщение отправлено: 13 апреля 2015 15:16
Ух-ты, PIC умеет считать с плавающей запятой! То-то разработчики задалбываются с расчётами тактов на выполнение инструкций... Float (2/2)== |
Сейчас на форуме |
pahan
Advanced Member
Откуда: Химки, М.О. Всего сообщений: 1070 Рейтинг пользователя: 0 Ссылка Дата регистрации на форуме: 13 мар. 2015 |
387 даёт результаты, отличные от более ранних моделей при некоторых условиях в некоторых ситуациях. Особенно при обработке переполнений. Причина в том, что 387 полностью соответствует стандарту IEEE 754-1985, который изначально разрабатывался как стандартизация возможностей 8087го, но был в итоге несколько упрощён. За списком отличий - в разделы C и D Что я обнаружил интересного при отладке на 386/387SX. Результат умножения на 9й цифре после запятой может не совпадать раз в 100-300итераций. Долго думал, считать ли это ошибкой. Решил, что раз система у меня не разогнанная, сопроцессор ULSI вполне себе качественный, то этот нюанс на совести Турбо Паскаля. Я обрезал результат умножения до типа single (а деление оставил типа real, раз ошибок нет), и решил смириться с точностью 8 знаков после запятой. Теперь обдумываю, почему деление не вызывает такой неточности, ведь по-моему деление более сложный математический процесс, нежели умножение.документа. У неинтеловских сопроцессоров могут быть дополнительно свои различия в скорости и точности вычислений. А синус с косинусом точно не надо, отдельные команды для них появились только в 387. |
sanders
Advanced Member
Профессионал Откуда: Санкт-Петербург Всего сообщений: 6434 Рейтинг пользователя: 0 Ссылка Дата регистрации на форуме: 26 мар. 2008 |
Странная информация. На чем основана? В даташите на 8087 английским по белому написано, что он содержит арифметические, логарифмческие, тригонометрические команды. То есть уже 8087 должен уметь вычислять тригонометрию. И на счет идентичности результатов в моем сообщении Вы не поняли: я имел в виду, что вычисленные 255 результатов подряд на одной машине с одним и тем же сопроцессором, разве что чередуясь с другими операциями, раз в 100...300 итераций вдруг отличаются после 8го знака. |
pahan
Advanced Member
Откуда: Химки, М.О. Всего сообщений: 1070 Рейтинг пользователя: 0 Ссылка Дата регистрации на форуме: 13 мар. 2015 |
Профиль | Сообщить модератору
NEW! Сообщение отправлено: 14 апреля 2015 18:49 Сообщение отредактировано: 15 апреля 2015 13:37 Ну я же дал ссылку на Странная информация. На чем основана?родной интеловский мануал. Их две - FPTAN (тангенс) и FPATAN ( В даташите на 8087 английским по белому написано, что он содержит арифметические, логарифмческие, тригонометрические команды. Отдельные команды FSIN (синус), FCOS (косинус), FSINCOS (оба сразу) появились именно в 387. Отличаются от чего? От тех же самых операций над теми же самыми числами на том же или другом сопроцессоре? И кстати, в какой разрядности (32, 64, 80 бит) проводятся вычисления и в какой выводится конечный результат? И на счет идентичности результатов в моем сообщении Вы не поняли: я имел в виду, что вычисленные 255 результатов подряд на одной машине с одним и тем же сопроцессором, разве что чередуясь с другими операциями, раз в 100...300 итераций вдруг отличаются после 8го знака. |
sanders
Advanced Member
Профессионал Откуда: Санкт-Петербург Всего сообщений: 6434 Рейтинг пользователя: 0 Ссылка Дата регистрации на форуме: 26 мар. 2008 |
Профиль | Сообщить модератору
NEW! Сообщение отправлено: 14 апреля 2015 21:21 Сообщение отредактировано: 14 апреля 2015 21:27
pahan написал: Отличаются по ходу выполнения программы, спустя микросекунду или сколько там времени нужно на следующее вычисление. Отличаются от чего? От тех же самых операций над теми же самыми числами на том же или другом сопроцессоре? И кстати, в какой разрядности (32, 64, 80 бит) проводятся вычисления и в какой выводится конечный результат? Алгоритм такой: - цикл от 1 до 255. а(i):=X_случайное число умножить на Y_случайное число b(i):=X_случайное число делить на Y_cлучайное число конец цикла - цикл от 2 до 255 если a(1)>>a(i) то аварийный останов с выдачей несовпадения a(1) и a(i) если b(1)>>b(i) то аварийный останов с выдачей несовпадения b(1) и b(i) конец цикла И такие итреации крутятся в главном цикле от 1 до 65535. Так вот, останов по ошибке умножения выпадает спустя 100...300 итреаций. Останов по ошибке деления - никогда! Разрядность массивов результатов умножения и деления = real - кажется это 32 байт. На 9 знаке выпадает ошибка. Пришлось уменьшить разрядность до single = 8 байт - сейчас нет под рукой хэлпа по Турбо Паскалю, а память стала подводить, но вроде разрядность такая. Причем отлаживал я прогу на 386/387SX с сопроцессором ULSI (не на 8087, уж очень все медленно на ХТ). Я не исследовал детально этот феномен. Можно попробовать компильнуть без сопроцессора, а задав его эмуляцию и сравнить результат. Можно попробовать не чередовать умножение и деление (может что-то где-то засоряется в регистрах), а выполнить подряд только умножение и сравнить... Но это если меня снова пробьет на программирование. Пока что стояла задача понять, можно ли использовать 8087 на повышенных частотах, и если да, то каков критерий рабочести, а если нет, то почему. Что-то у меня этот редактор нашего форума индекс i в квадратных скобках воспринимает, как тэг курсива. Пришлось ставить круглые скобки. А как отключать тэги в сообщении? |
Fe-Restorator |
NEW! Сообщение отправлено: 15 апреля 2015 13:28
Сопр не умеет считать на 8-ми битах. Равно и на 16, на 32... Заложена в него способность вычислять на 80-ти битах, значит именно так он и будет работать, постоянно, независимо от разрядности входящих данных. Теоретически, неиспользуемые разряды должны быть обнулены, однако на практике - это не всегда так. Особенно для сопра, разогнанного по частоте. И приведение результата счёта к требуемой разрядности тоже влияет, округлением до N-ного знака. Поясню: случайная ересь в разрядах с 10-го по 80-й (при вычислениях) легко накрутит значение в 9-м разряде, с некоторым трудом - и в 8-мом. Округление до 8-го разряда дополнительно накрутит 8-й разряд. Примерно таков механизм ошибок, если отвлечься от битности/разрядности. |
Сейчас на форуме |
i8088
Advanced Member
Откуда: г. Баку, Азербайджан Всего сообщений: 2132 Рейтинг пользователя: 0 Ссылка Дата регистрации на форуме: 30 янв. 2015 |
Все числа внутри FPU всегда числа с расширенной точностью. При загрузке числа одинарной, двойной точности целого - FPU просто преобразует любое число в формвт расширенной точности, при выгрузке числа в память - наоборот(в зависимости от того с какой точностью работаем). Ни о каком отбрасывании или обнулении неиспользуемых бит разговор не идет. Да и форматы чисел с плавающей точкой не такие чтобы можно было что-то отбрасывать. |
Fe-Restorator |
NEW! Сообщение отправлено: 17 апреля 2015 9:31
i8088 написал: Вот на этом этапе и происходит дополнение нулями до нужного формата чисел. Токма в разогнанном сопре обнуление не всегда надёжно - появление самопроизвольных бит весьма вероятно, оно и вносит ошибки в вычисления. FPU просто преобразует любое число в формвт расширенной точности, |
Сейчас на форуме |
i8088
Advanced Member
Откуда: г. Баку, Азербайджан Всего сообщений: 2132 Рейтинг пользователя: 0 Ссылка Дата регистрации на форуме: 30 янв. 2015 |
Профиль | Сообщить модератору
NEW! Сообщение отправлено: 17 апреля 2015 10:57 Сообщение отредактировано: 17 апреля 2015 11:02
Для большей ясности уточню: нулями может дополняться только мантисса, порядок числа хранится смещенным(на 127 для чисел одинарной точности, если память не изменяет) и соответственно дополнение нулем или единицей зависит от от знака порядка(крайние порядки зарезервированы для специальных значений). Конечно в разогнанном FPU возможны какие угодно сбои, как Вы совершенно справедливо отметили. |
sanders
Advanced Member
Профессионал Откуда: Санкт-Петербург Всего сообщений: 6434 Рейтинг пользователя: 0 Ссылка Дата регистрации на форуме: 26 мар. 2008 |
Господа, вы уже спориите на абстрактные темы. Вы ушли от фактов и выхватываете верхушки, не анализируя связи. Я отлаживал программу и столкнулся с погрешностью НА НЕРАЗОГНАННОМ 387SX ULSI. А во-вторых, ваши теории неверны, поскольку при делении погрешность не возникает. В-третьих, абсурдно предполагать, что какие-то биты не обнуляются. 299 раз обнулились, а на 300й нет? Вот вернется у меня программисткое настроение, тогда проверю на разных процессорах, сопроцессорах и с разными форматами данных. Может, просто в компиляторе ошибка, как много их было в макросах Экселя 6.0 |
<<Назад Вперед>> | Страницы: 1 2 3 4 5 * 6 7 | Печать |
Полигон-2 » IBM PC-совместимое. До 2000 года включительно » Сопроцессоры 8087 и утилита mcpdiag |
1 посетитель просмотрел эту тему за последние 15 минут |
В том числе: 1 гость, 0 скрытых пользователей |
Последние | |
[Москва] LIQUID-Акция. Сливаются разъемы CF МС7004 и 7004А на AT и XT Пайка термотрубок Проммать s478 PEAK 715VL2-HT ( Full-Size SBC) Подскажите по 386 материке по джамперам. |
Самые активные 5 тем | |