Страница 1 из 3

Добавлено: 18 мар 2004, 10:59
Andy
Вопрос непонятен - причем тут ассемблер? Описать новый тип данных можно средствами C++. И проблема только одна - нужно самому заботиться о выполнении операций с этим новым типом.

Добавлено: 31 мар 2004, 10:58
Romeo
В случаях, когда требуется оптимизировать время о С++ даже не соит заводить разговор. Выхода, на самом деле, два: экстенсивный или интенсивный. Либо обеспечиваем повышенную точность, создавая inline asm функции, оперирующие (к примиру) 12 байтными данными, либо присекаем проблему ещё раньше (интенсивный путь): проводим математические иследования системы, выясняем устойчивость решений, если можно - вводим масштабирующие коэффициенты.

Второй путь предпочтительней, однако требует б`ольших знаний и не всегда даёт положительные результаты. Первый путь применяется, когда второй ни к чему хорошому не привёл.

Добавлено: 31 мар 2004, 11:31
Andy
когда требуется оптимизировать время о С++ даже не соит заводить разговор.
Ой, ну я уже смеюсь. С++ очень хорош с точки зрения оптимизации кода. Беседа здесь просто не имеет смысла - потому что причем тут тип данных и ассемблер? И что значит тип данных на ассемблере? Это масло-маслянное. Если что медленно работает надо 10 раз оптимизировать функции и если так надо переписать парочку критических на ассемблере. Если нужен большой размер переменной - так сделайте ее батовым массивом размером в пару килобайт.

Добавлено: 31 мар 2004, 12:45
Romeo
Ну зачем над человеком смеяться. Нужно объяснять, а не тыкать пальцем и кататься по полу. Все когда-то были такими. Я сам помню, как года четыре назад создал класс, обеспечивающий оперирование с двухсотзначными цифрами и неимоверно этим гордился. Однако, когда проверил скорость работы - осознал всю нелепость подобных затей. Класс имел красивую реализацию, но давал очень низкие результаты на трудоёмких задачах. Короче получилась хорошая демонстрация возможностей С++, но плохой продукт. Я плюнул на всё это дело и написал нужный функции на чистом асме, а потом подлинковал его к проекту :)

Добавлено: 02 апр 2004, 13:00
Romeo
Текст, боюсь, сейчас уже не смогу найти. Это было давно. А рассказать смогу.
Нужно обзавестись кучей функций:

add_12
sub_12
div_12
mult_12

которые не обязательно писать на чистом asm'е, можно просто делать ассемблерный вставки. Каждая функция должна получать три параметра: два входных и один выходной (результат). Например так:

Код: Выделить всё

void add_12(void * p1, void * p2, void * pResult);
Каждая из этих четырёх функций будет интерпритировать всё свои три параметра, как адресса, по которым хранятся двенадцати байтные целые. Тело функции будет состоять из asm вставки и делать то, что мы привыкли делать на "бумажке", оперирируя большими числами. Теперь выясним под какую платформу ты пишешь, под DOS или Windows. В зависимости от этого в цикле обработки чисел мы будем использовать слова или двойные слова соответственно. И так, например add_12, будет выполнять следующие действия. Она будет складывать слова (или двойные слова), начиная с младшего если произошло переполнение регистра (т.е. CF = 1), то добавлять к старшему слову (двойному слову) единичку. Так же работает sub_12 в цикле пробегая в loop'е все двенадцать байт по словам (двойным словам), производя вычитания и делая заём в старшем слове (двойном слове) если CF = 1.

С "умножить" и "разделить" будет немного сложнее, но, если ты в школе умножал и делил в столбик, то никаких проблем не должно возникнуть. Одна маленькая подсказка: вместо того, чтобы умножать число на 10 (т.е. "сдвинуть" его при умножении в столбик) значительно быстрее будет выполнить два логических сдвига и одно умножение по формуле:

a*10 = (a<<3) + (a<<1)

Соответствующую формулу для деления на 10 выведи сам, уж не поленись. Рузультат оптимизации впечатляющий - обещаю.

Теперь как перейти от целочисленных случая к числам с плавающей точкой. Варианты два: почитать, как делает подобные вычисления славноизвестный сопроцессор и реализовать по-своему для больших чисел, ввести масштабирующий коэфициент для твоей системы (это уже математическая уловка), который бы позволил интерпритировать все неизвестные, как целочисленные переменные. В любом случае читай что-нить по ассемблеру и матан с функам. Полезная вещь :)

Удачи.

Добавлено: 02 апр 2004, 13:10
Romeo
И вообще, если захочешь пообсуждать это во всех деталях и позадавать вопросы (а они, думаю, обязательно появяться), попроси DeeJayC или Hawk перенести эту тему в раздел, посвящённый ассемблеру. Там, кстати, заведует тот самый Andy, который тебе ответил самый первый раз... :)

Добавлено: 02 апр 2004, 14:06
Andy
Romeo, эта тема не касается ассемблера, поэтому ее переносить не надо. Цитирую ее автора:
Можно ли с помощью ассемблерных вставок в C++Builder написать новый тип данных (например, тройной точности). Стандартные типы double, long double не подходят ввиду необходимости в "великой" точности.
Речь идет только о точности, а не о скорости. Т.е. человеку нужен тип данных бОльшего размера (большей точности). Причем тут ассемблер? НЕ понимаю. Типов данных в ассемблере (читай в процессоре) еще меньше, чем в С++. Приведу ПОЛНУЮ таблицу типов данных с которыми работает FPU. Извиняйте за форматирование, но html отключен, поэтому таблица будет своеобразная...

Код: Выделить всё

Тип							Бит		Значащих цифр

Целое слово					16		4
Короткое слово				32		9
Длинное слово				64		18
Упакованное десятичное		80		18
Короткое вещественное		32		7
Длинное вещественное		64		15-16
Расширенное вещественное	80		19
И не более того... Где тут супер точность? Таким образом вопрос об использовании типов данных ассемблера снимается.
Если нужна суперточность, то пожалуйста делаем тип размером в 200 байт (typedef (?)) но только реализацию базовых операций берем на себя. Тут, кстати, очень удобно будет отдельный класс для этого типа написать.