OSDev

для всех
Текущее время: 01 июл 2025, 14:30

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 285 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12, 13, 14 ... 29  След.
Автор Сообщение
СообщениеДобавлено: 16 дек 2014, 23:25 
Аватара пользователя

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
pavia писал(а):
Комплексные значит взяли. А как же кватернионы, матрицы, тензоры и тп?

Не взяли ещё, думаем. Но я хочу сказать, что они реально нужны. Кватернионы нужны ещё реже, чем p-адические аппроксимации.
Простые примеры, где нужны комплексные числа: корни квадратного уравнения, некоторые виды интегрирования, производящие функции. Они на самом деле нередко вылазят. Последнее время особенно часто попадались мне при факторизации полиномов.

pavia писал(а):
А как вы себе это представляете? Ведь деление таких чисел бесконечный процесс?

Так же как это сделано в GMP. Есть некий параметр, определяющий точность, его можно задавать руками. Тут, конечно, не совсем всё автоматическое как в случае с целыми числами, но иначе никак.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 дек 2014, 23:32 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Тогда так и называйте их как длинные числа. Или как принято у американцев переменной точности - что более правильно.

А то бесконечность предполагает отсутствие замкнутости, а здесь диапазон чисел имеет точную верхнюю границу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 дек 2014, 23:57 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 241
Откуда: Санкт-Петербург
Zealint писал(а):
Но оставляет проблему tab-hell (так я буду её называть), когда открываешь чужой код, а там... приходится бежать за тазиком, чтобы на пол не вырвало.

:lol: :lol: :lol: От души посмеялся, спасибо! На этом форуме редко кто образно выражается. :D

А теперь серьезно. Всё правильно, табуляции пришли к нам из телетайпов и по инерции закрепились в таблице символов. Сейчас же, как мне кажется, использование символов табуляции зависит от синтаксиса языка. Чисто по статистике: табуляции довольно часто используются программистами на ассемблерах и языках с Си-подобным синтаксисом (С/С++, PHP, JavaScript, -- сам сталкивался) и практически не используются в языках с перевесом ключевых слов над значками (Паскаль, PL/SQL, Руби). Навскидку пруфов привести не смогу, но об этом кто-то из авторитетных авторов писал. Сам я считаю эту взаимосвязь доказанной и потвержденной на практике. Для меня лично табуляция (отступ) -- это два пробела. Священных войн "табы против пробелов" среди программистов на Delphi также не наблюдается.

С чужими же исходниками приходится мириться, да. Не так часто с ними сталкиваюсь, обхожусь без тазика. Зато среди Паскаль-программистов есть своя беда -- немецкий стиль, как я его про себя называю. Вроде уже 20 лет на Паскале пишу, а код в немецком стиле не воспринимаю, -- тупо не понимаю, читаю как бы между строк. Оформление исходников -- это важно, согласен.

Zealint писал(а):
Представьте, таблицу из 16-теричных чисел, которую хочется выровнять и сделать красивой, чтобы столбцы ровными были, и придётся каждое из чисел начинать с 0 или с пробела. Либо будет лишний 0 где-то, либо «рваная» граница столбца из-за пробелов.

Советую обратить внимание на то, как сделано в FASM. В нем шестнадцатиричные числа можно объявлять как традиционным для ассемблера способом, предлагаемым Yoda, так и с лидирующим "$", позаимствованым у TP/Delphi и их встроенного ассемблера.

_________________
Путь успеха Циолковского — правильно умереть


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 дек 2014, 00:05 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
Цитата:
Советую обратить внимание на то, как сделано в FASM. В нем шестнадцатиричные числа можно объявлять как традиционным для ассемблера способом, предлагаемым Yoda, так и с лидирующим "$", позаимствованым у TP/Delphi и их встроенного ассемблера.

... и еще в сишном стиле. Короче, вообще как угодно.
Код:
mov eax, 0DEADBEEFh
mov eax, 0xDEADBEEF
mov eax, $DEADBEEF


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 дек 2014, 00:13 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Zealint писал(а):
pavia писал(а):
Комплексные значит взяли. А как же кватернионы, матрицы, тензоры и тп?

Не взяли ещё, думаем. Но я хочу сказать, что они реально нужны. Кватернионы нужны ещё реже, чем p-адические аппроксимации.
Простые примеры, где нужны комплексные числа: корни квадратного уравнения, некоторые виды интегрирования, производящие функции. Они на самом деле нередко вылазят. Последнее время особенно часто попадались мне при факторизации полиномов.

Я тоже думаю что комплексные числа нужны. Уж больно часто на них натыкаешься.
Я вообще хотел отказаться от встроенных типов. Описать все типы через IR(intermediate representation).
Оставить только базовые свойства. Проблема в том что свойства это верёвка достаточной длины что-бы выстрелить себе в ногу. Поэтому отказался. И как следствие от перегрузки операторов.
Хотя если оставить базовые свойства как в поле чисел. Может что и получится.
Как не крути, а как в анекдоте хвост поднял нос увяз, нос поднял хвост увяз.

Короче думаю тут нужно подходить согласно учению ТРИЗ. Сбор информации, классификация и тд.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 дек 2014, 00:18 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Bargest писал(а):
Цитата:
Советую обратить внимание на то, как сделано в FASM. В нем шестнадцатиричные числа можно объявлять как традиционным для ассемблера способом, предлагаемым Yoda, так и с лидирующим "$", позаимствованым у TP/Delphi и их встроенного ассемблера.

... и еще в сишном стиле. Короче, вообще как угодно.
Код:
mov eax, 0DEADBEEFh
mov eax, 0xDEADBEEF
mov eax, $DEADBEEF

А потом ещё можно вспомнить анахронизм борланд паскаля 7.0 с его числами ^A, ^B, ^C и тд В жизни не отгадаете какие номера у этих чисел? Они тоже с телетайпа сохранились.
Зачем плодить лишних существ. Лучше минимализм, а то потом замучаешься всех кормить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 дек 2014, 03:44 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 241
Откуда: Санкт-Петербург
pavia писал(а):
А потом ещё можно вспомнить анахронизм борланд паскаля 7.0 с его числами ^A, ^B, ^C и тд

Не 7.0, а 1.0. В 3.0 уже точно были. И под CP/M. Я недавно специально книжку по CP/M прочел, чтобы восстановить события. В жизни не приходилось с CP/M сталкиваться, сразу с DOS 3.3 начинал.

_________________
Путь успеха Циолковского — правильно умереть


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 дек 2014, 13:43 

Зарегистрирован: 15 апр 2014, 14:13
Сообщения: 127
SII писал(а):
Ага, Ада рулит! :))

И по каким причинам ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 дек 2014, 16:06 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 976
Откуда: Дагоба
Zealint писал(а):
Result.h имеет размер 40 бит?

72-64 = 8 бит.

Zealint писал(а):
Но оставляет проблему tab-hell (так я буду её называть), когда открываешь чужой код, а там... приходится бежать за тазиком, чтобы на пол не вырвало.

Таких мест полно и без табуляций. В данном случае важно, что визуальное представление не оказывает непосредственное влияние на формальную корректность.

Zealint писал(а):
Да. Только слово "условно" тут лишнее.

Нет, совсем не лишнее. Если мы присваиваем результат умножения 32-битных чисел 32-битному числу, то потенциально теряем старшие разряды. Т.е. такое присваивание нельзя считать действительно безопасным, но и замечания выводить нехорошо.

Zealint писал(а):
Тут два варианта: либо преобразование типов действительно безопасно, либо, создавая новый тип, мы пишет ещё 100 функций его безопасного преобразования куда нужно. Небезопасное приведение (то, которое может привести к неожидаемой образованным программистом потере точности), нужно исключить из языка.

Да нет же, вариантов на самом деле три: опасное, безопасное и условно-безопасное.
1. Опасное - приведение целого числа к типу "указатель".
2. Безопасное - преобразование 32-битного числа в 64-битное.
3. Условно безопасное - преобразование 32-битного числа в 16-битное.

Zealint писал(а):
Хорошо, я подумаю над этим. Точно ли, что компилятор всегда сможет определить размер промежуточных результатов правильно?

Я полагаю, да, всегда может.

Zealint писал(а):
Да я, в общем-то, согласен. Просто жалко. Представьте, таблицу из 16-теричных чисел, которую хочется выровнять и сделать красивой, чтобы столбцы ровными были, и придётся каждое из чисел начинать с 0 или с пробела. Либо будет лишний 0 где-то, либо «рваная» граница столбца из-за пробелов.

А если у вас таблица десятеричных чисел? А если двоичных чисел? Как раз 0 здесь совсем не лишний.

Zealint писал(а):
Иногда хочется выйти из блока кода, который не в цикле, собственно, я и привёл такой пример, в котором программист вынужден делать фальшивый цикл (do..while (false)) ради такой возможности. Делать это с помощью goto плохо, это требует создавать метку после блока. Данная метка кажется явно лишней.

Вы правильно заметили - иногда. Вот в этих редких случаях использование оператора goto вполне оправдано. В большинстве же случаев можно просто реорганизовать условные операторы так, чтобы потребности в goto не возникало. А вот выходить из циклов приходится часто.

Zealint писал(а):
Ну, если синтаксис break с условием уже устоялся, тогда лучше именовать циклы.
Код:
first : for ( ) {
  second : for ( ) {
    break [first] ( условие );
  }
}

Чем это отличается от goto? Наличием условия и тем, что метка находится перед циклом, можно давать осмысленные имена циклам, не нужно делать метку за циклом, и вообще посимпатичнее.

Оно может быть и посимпатичней, но несколько нарушает логику. В данном случае first и second - метки, а значит, их использование воспринимается как потенциальный переход НА них. То, что с оператором break они работают по другому, является исключением, а чем больше исключений, тем хуже структура языка. Оператор goto в данной ситуации не добавляет ни одного лишнего символа и не привносит в правила исключений.

Zealint писал(а):
Квадратные скобки в break как бы намекают на свою необязательность и не конфликтуют не с чем другим, если Вы в своём синтаксисе используете их примерно так же, как они сейчас используются в C++.

Логично. Неплохая идея.

Zealint писал(а):
Я надеюсь, Вам не пришло в голову, например, передавать параметры в функцию через квадратные скобки, как это пришло в голову Стивену Вольфраму?

Не вижу разумных оснований для такого извращения.

Zealint писал(а):
Yoda писал(а):
- Размер результата взятия остатка от деления равен размеру делимого.

Почему? Остаток же не превосходит частного.

Да, действительно, ошибся. Размер результата взятия остатка от деления равен размеру делителя.

Zealint писал(а):
Кстати, остаток от деления «математический» или «программистский»?

А в чём разница?

Zealint писал(а):
Yoda писал(а):
- Размер результата возведения в степень равен 128 бит независимо от размеров операндов.

Хм... 2^1000 не будет считать? Язык должен поддерживать бесконечный целый тип, и если результат влезет только в него, то его-то и нужно использовать.

Тут вот какое дело. Бесконечный целый тип поддерживается не компилятором, а библиотеками, а это принципиальная разница. Поэтому, чтобы возводить в такую степень, надо сначала основание или показатель привести к бесконечному типу, тогда вместо встроенного возведения будет вызвана функция из библиотеки.

Zealint писал(а):
Кстати, у Вас будет оператор возведения в степень? Это как бы не совсем отражает архитектуру и неочевиден вопрос его эффективной реализации. Есть много вариантов: Вы который предпочитаете?

Да, будет. Дело тут не столько в эффективности реализации, сколько в удобстве записи. Я думаю, ** - будет достаточно понятно и удобно.

Zealint писал(а):
Должны быть типы данных, отражающие размерность регистров ЭВМ. Int8, int16, int32, int64. Со знаком и без него. Как мы их будем называть – это сейчас не важно. Эти типы данных реализуются аппаратно.

Точно. Более того, в моей концепции исключён тип данных int без указания размера. Программист должен чётко понимать, какой диапазон ему требуется.

Zealint писал(а):
Должны быть типы данных, которые имеют больший размер. Int128, int256 и некоторые другие (пояснения ниже). Эти типы реализованы программно.

int128 - да, другие нет. Причина вот в чём. 64 бита - максимальная разрядность, которая может быть широко востребована, следовательно это последний тип, который действительно имеет смысл реализовывать полностью аппаратно. int128 рассматриваю в качестве последнего программно реализованного встроенного типа по одной причине, - только как основа для библиотеки бесконечной точности. Цепочные операции без расширения разрядности (то есть во всех традиционных языках программирования) можно реализовать только с потерей эффективности. Например, если нам потребуется программная реализация 128-битных чисел в традиционных ЯВУ, мы должны прибегнуть к 32-битным умножениям с переносом старших половин, несмотря на то, что архитектура может поддерживать 64-битные операции. То есть, ЯВУ накладывает искусственные ограничения на ровном месте. Введение int128 даёт красивую возможность избежать этого. int256 (и бОльшие размеры) - явно лишние.

Zealint писал(а):
Представьте, что появился регистр размером 128 бит (ну мало ли). Тогда тип int128 из искусственного должен перекочевать в естественный для нашего языка, но при этом абсолютно все программы, которые можно написать с его участием, будут компилироваться правильно.

Хотя мне сложно себе представить массовую архитектуру с аппаратной поддержкой 128 бит (я бы даже сказал, что вряд ли такая появится, но буду осторожен), но в этом случае ничего принципиально не сломается. Будет введён программный тип int256 и вся схема будет прозрачно расширена до этого типа.

Zealint писал(а):
До каких пор нам нужны типы int128, int256, int512... ? Здесь нет общего мнения.

Общего нет. Моё личное мнение таково: последний аппаратный - int64, int128 - софтверный, далее - библиотечный бесконечной точности. Если архитектура не поддерживает 64-битную арифметику аппаратно, то оба типа (64 и 128) реализуются программно, но оба должны обязательно присутствовать.

Zealint писал(а):
Дело вот всё в чём. Есть у нас GMP и MPIR - самая лучшая на сегодня длинная арифметика. Но когда мы заведомо знаем, что наши числа не превосходят 1024 бита, то искусственно созданный тип такого размера будет выигрывать по скорости и по памяти у GMP. Если нам нужно 2048 и больше, то здесь выигрыш уже будет менее существенным, и игра не стоит свеч. Число 1024 я тут взял навскидку, можно провести исследование и отыскать эту «золотую середину», но сейчас это не нужно. Общая мысль такая: нужно отыскать баланс по эффективности и создать достаточно целых типов данных, чтобы обеспечить программиста эффективным инструментом. В моей практике приходилось работать с int512 и по эффективности рвать GMP на части благодаря этому.

Я думаю, идеальным в данной ситуации было бы как раз позволить пользователю определять эти типы самостоятельно и не резервировать эти имена.

Zealint писал(а):
Здесь нужно придерживаться имеющихся стандартов и возможностей ЭВМ. То есть создать типы real32, real64, real80 и пока успокоиться на этом, зарезервировав все подобные названия типов на будущее.

Опять же, всё правильно, за исключением того, что резервировать отсутствующие не надо. Иначе пользователь не сможет определить их своими библиотеками.

Zealint писал(а):
Должен быть тип real, который объемлет все плавающие типы и имеет бесконечную точность.

С арифметическими операциями всё в порядке, а вот иррациональные уже не сделать. Возвести в нецелую степень уже не получится. Моё мнение таково, что по аналогии с расширением аппаратного 64-битного типа до программного 128-битного, возможно, нужна поддержка программного типа float256, но не более того.

Zealint писал(а):
Должен быть тип rational, который содержит числитель и знаменатель типа int. То есть дробь с бесконечной точностью.

Исключительно в качестве стандартной библиотеки. Кстати, да, забыл, целый тип бесконечной точности также должен входить в СТАНДАРТНУЮ библиотеку.

Zealint писал(а):
Нужен ли быть, например, тип rational32, числитель и знаменатель которого будет int32? Это вопрос интересный. Дело в том, что иногда возникает необходимость в таких типах, когда мы знаем, что результат будет довольно безобидным. Но проблема в том, что промежуточные данные (как для числителя, так и для знаменателя), особенно после многократного сложения/вычитания дробей, могут уйти далеко за пределы int32, что совершенно неочевидно предсказывается.

Я думаю, таких типов не надо, числитель и знаменатель должны иметь бесконечный диапазон. Редко когда числитель/знаменатель вписываются в такие маленькие диапазоны. Если пользователь уверен в диапазонах, пусть создаёт свой тип.

Zealint писал(а):
Аналогично рациональным. Это может быть немного печально, но придётся для них сделать суффикс i. Будем писать 2+3i.

Не вижу повода для печали. Нормальная запись.

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

Да не надо рационального комплексного. Встроенный тип - только на основе плавающей арифметики.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 дек 2014, 16:07 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 976
Откуда: Дагоба
pavia писал(а):
Комплексные значит взяли. А как же кватернионы, матрицы, тензоры и тп?

Комплексные числа используются повсеместно в физике и математике. Кватернионы (и другие гиперкомплексные числа) чаще всего сводятся к комплексным числам, если говорить про физическое моделирование, если они действительно потребовались - не проблема создать свой тип. Я его делал в С++. С матрицами и другими математическими объектами та же ситуация. Ничто не мешает создать новый класс.

pavia писал(а):
Цитата:
Должен быть тип real, который объемлет все плавающие типы и имеет бесконечную точность.
А как вы себе это представляете? Ведь деление таких чисел бесконечный процесс?

Никоим образом. Действительное число, введённое пользователем, на самом деле - рациональная дробь, в числителе которой значащие цифры, в знаменателе - количество десяток, соответствующее десятичной точке. Деление двух чисел осуществляется по законам деления рациональных чисел. Но проблемы всё равно есть, я их выше указал.

pavia писал(а):
Я тоже думаю что комплексные числа нужны. Уж больно часто на них натыкаешься.
Я вообще хотел отказаться от встроенных типов.

От встроенных комплексных чисел не стоит отказываться, т.к. "встроенность" позволит использовать удобную запись констант без вызовов конструкторов.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 285 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12, 13, 14 ... 29  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB