Внимание! Это временный неофициальный архив старой версии форума Полигон Призраков, созданный сочувствующим форуму участником. Этот сайт просуществует лишь до тех пор, пока администрация Полигона не сдержит своё обещание и не откроет официальный архив по адресу old.sannata.org.

Полигон-2

Форум о старых компьютерах

Объявление форума

Если пользуетесь личными сообщениями и получили по электронной почте оповещение о новом письме, не отвечайте, пожалуйста, почтой. Зайдите на форум и ответьте отправителю через ЛС.

Полигон-2 »   IBM PC-совместимое. До 2000 года включительно »   Сопроцессоры 8087 и утилита mcpdiag
RSS

Сопроцессоры 8087 и утилита mcpdiag

<<Назад  Вперед>> Страницы: 1 2 3 4 5 * 6 7
Печать
 
pahan
Advanced Member


Откуда: Химки, М.О.
Всего сообщений: 1070
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
13 мар. 2015
[q]
Странная информация. На чем основана?
[/q]
Ну я же дал ссылку на родной интеловский мануал.
[q]
В даташите на 8087 английским по белому написано, что он содержит арифметические, логарифмческие, тригонометрические команды.
[/q]
Их две - FPTAN (тангенс) и FPATAN (частичный арктангенс пожалуй, тут по-русски должно быть арктангенс частного - арктангенс угла, заданного точкой в декартовых координатах). Этого достаточно, чтобы получить остальные функции через квадрат тангенса, деление и квадратный корень.
Отдельные команды FSIN (синус), FCOS (косинус), FSINCOS (оба сразу) появились именно в 387.
[q]
И на счет идентичности результатов в моем сообщении Вы не поняли: я имел в виду, что вычисленные 255 результатов подряд на одной машине с одним и тем же сопроцессором, разве что чередуясь с другими операциями, раз в 100...300 итераций вдруг отличаются после 8го знака.
[/q]
Отличаются от чего? От тех же самых операций над теми же самыми числами на том же или другом сопроцессоре? И кстати, в какой разрядности (32, 64, 80 бит) проводятся вычисления и в какой выводится конечный результат?
sanders
Advanced Member
Профессионал

Откуда: Санкт-Петербург
Всего сообщений: 6434
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
26 мар. 2008
pahan написал:
[q]
Отличаются от чего? От тех же самых операций над теми же самыми числами на том же или другом сопроцессоре? И кстати, в какой разрядности (32, 64, 80 бит) проводятся вычисления и в какой выводится конечный результат?
[/q]
Отличаются по ходу выполнения программы, спустя микросекунду или сколько там времени нужно на следующее вычисление.
Алгоритм такой:
- цикл от 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
Гость

Ссылка

Сопр не умеет считать на 8-ми битах. Равно и на 16, на 32... Заложена в него способность вычислять на 80-ти битах, значит именно так он и будет работать, постоянно, независимо от разрядности входящих данных.
Теоретически, неиспользуемые разряды должны быть обнулены, однако на практике - это не всегда так. Особенно для сопра, разогнанного по частоте. И приведение результата счёта к требуемой разрядности тоже влияет, округлением до N-ного знака.

Поясню: случайная ересь в разрядах с 10-го по 80-й (при вычислениях) легко накрутит значение в 9-м разряде, с некоторым трудом - и в 8-мом. Округление до 8-го разряда дополнительно накрутит 8-й разряд.
Примерно таков механизм ошибок, если отвлечься от битности/разрядности.
Сейчас на форуме
i8088
Advanced Member


Откуда: г. Баку, Азербайджан
Всего сообщений: 2132
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Все числа внутри FPU всегда числа с расширенной точностью.

При загрузке числа одинарной, двойной точности целого - FPU просто
преобразует любое число в формвт расширенной точности, при выгрузке
числа в память - наоборот(в зависимости от того с какой точностью
работаем).

Ни о каком отбрасывании или обнулении неиспользуемых бит разговор
не идет. Да и форматы чисел с плавающей точкой не такие чтобы можно
было что-то отбрасывать.
Fe-Restorator
Гость

Ссылка

i8088 написал:
[q]
FPU просто преобразует любое число в формвт расширенной точности,
[/q]
Вот на этом этапе и происходит дополнение нулями до нужного формата чисел. Токма в разогнанном сопре обнуление не всегда надёжно - появление самопроизвольных бит весьма вероятно, оно и вносит ошибки в вычисления.
Сейчас на форуме
i8088
Advanced Member


Откуда: г. Баку, Азербайджан
Всего сообщений: 2132
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
30 янв. 2015
Для большей ясности уточню: нулями может дополняться только мантисса, порядок числа хранится
смещенным(на 127 для чисел одинарной точности, если память не изменяет) и соответственно
дополнение нулем или единицей зависит от от знака порядка(крайние порядки зарезервированы для
специальных значений).
Конечно в разогнанном FPU возможны какие угодно сбои, как Вы совершенно справедливо отметили.
sanders
Advanced Member
Профессионал

Откуда: Санкт-Петербург
Всего сообщений: 6434
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
26 мар. 2008
Господа, вы уже спориите на абстрактные темы. Вы ушли от фактов и выхватываете верхушки, не анализируя связи.
Я отлаживал программу и столкнулся с погрешностью НА НЕРАЗОГНАННОМ 387SX ULSI. А во-вторых, ваши теории неверны, поскольку при делении погрешность не возникает. В-третьих, абсурдно предполагать, что какие-то биты не обнуляются. 299 раз обнулились, а на 300й нет?
Вот вернется у меня программисткое настроение, тогда проверю на разных процессорах, сопроцессорах и с разными форматами данных. Может, просто в компиляторе ошибка, как много их было в макросах Экселя 6.0
Fe-Restorator
Гость

Ссылка

sanders написал:
[q]
Я отлаживал программу и столкнулся с погрешностью НА НЕРАЗОГНАННОМ 387SX ULSI
[/q]
Лучше-бы отладка проводилась на DX40, 486-го поколения. Там хотя-бы нет разбежки частот проца с сопром, возможных издержек на этой почве.
А поскольку целевой сопр именно 8087, то и на нём стоило отлаживать, ибо также нет разбежки частот, несмотря на отдельность чипа.
Сейчас на форуме
i8088
Advanced Member


Откуда: г. Баку, Азербайджан
Всего сообщений: 2132
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
30 янв. 2015
sanders написал:
[q]
Господа, вы уже спориите на абстрактные темы.
[/q]
Согласен, я люблю теорию!
Вполне возможно и ошибка в компиляторе, однозначно можно проверить
написав все на ассемблере. Кстати что за компилятор у Вас? Можно
попробовать откомпилировать другим компилятором или по крайней
мере другой версией компилятора.

С разными версиями компилятора(или компиляторы разных фирм) часто
требуется некоторая коррекция программы, но это решаемо.

Сейчас обратил внимание на Ваш алгоритм
[q]
- цикл от 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)
конец цикла
[/q]
Те Вы пользуетесь функцией rnd для генерации случайное чисел? Может быть погрешность
возникает просто при некоторых сочетаниях операндов, поэтому и не сразу проявляется?

Проверьте на более современных FPU, там такое наблюдается? Надо поискать errata
документы для старых FPU, какие ошибки были найдены.
sanders
Advanced Member
Профессионал

Откуда: Санкт-Петербург
Всего сообщений: 6434
Рейтинг пользователя: 0


Ссылка


Дата регистрации на форуме:
26 мар. 2008
X и Y постоянные случайные числа! Не разные.
Грубо говоря я 255 раз умножаю 2 на 2 и запоминаю результат. Потом проверяю. Если все 255 раз ответ был 4, то меняю операнд и снова 255 раз... И вдруг на каком-то этапе ответ не сходится единственный раз из 255. Почему ответ не 4? Причем 254 раза ответ 4, а 255й не 4. Вот я о чем.
Я бы понял, если бы сопроцессор неправильно умножал 2 на 2. Но он бы одинаково неправильный ответ давал все 255 раза. А он дает единственный неверный результат из 255. Операнд 2 на 2 выбран для демонстрации идеи.
Пользовался Turbo Pascal 6.0 со встроенным компилятором.
<<Назад  Вперед>> Страницы: 1 2 3 4 5 * 6 7
Печать
Полигон-2 »   IBM PC-совместимое. До 2000 года включительно »   Сопроцессоры 8087 и утилита mcpdiag
RSS

0 посетителей просмотрели эту тему за последние 15 минут
В том числе: 0 гостей, 0 скрытых пользователей

Последние RSS
[Москва] LIQUID-Акция. Сливаются разъемы CF
МС7004 и 7004А на AT и XT
Пайка термотрубок
Проммать s478 PEAK 715VL2-HT ( Full-Size SBC)
Подскажите по 386 материке по джамперам.

Самые активные 5 тем RSS