OSDev

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

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




Начать новую тему Ответить на тему  [ Сообщений: 285 ]  На страницу Пред.  1 ... 6, 7, 8, 9, 10, 11, 12 ... 29  След.
Автор Сообщение
СообщениеДобавлено: 16 дек 2014, 00:35 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Zealint писал(а):
Yoda писал(а):
А если вспомнить, что даже операции с плавающей точкой как правило приводят к потере точности (а то и к переполнению), нужно ли после каждой операции над числами типа float приводить результат к float?

Если это не следует из контекста, то да. Если написана команда float=float*float, то умножаем как есть с одинарной точностью. Если написано double = float*float, значит нужно обеспечить умножение с удвоенной точностью.

Не согласен, потому что вычисление двойной точности происходит в 2 раза медленнее.
При необходимости можно double = (double)float*float.

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


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

Зарегистрирован: 17 фев 2013, 16:13
Сообщения: 163
Himik писал(а):
В общем-то ситуация с умножением целых и реальных чисел в x86 разная. Умножение целых чисел всегда даёт удвоенный размер данных, а реальные числа остаются того же размера, поэтому применение каких-либо правил будет конфликтовать либо с одним, либо с другим типом, не поддающимся вашей логике.

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

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


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

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Zealint писал(а):
Косяк в такой логике в другом: непонятно как перемножать переменный с разной точностью. Например целое число с бесконечной точностью помножить на один байт (тут преобразование типа не требуется). Или плавающее число с одинарной точностью на плавающее с бесконечной (тут преобразование типа потребуется). Я подозреваю, что тут нужны особые правила.

Меньший размер надо приводить к большему из сомножителей. Это работает в С.


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

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Zealint писал(а):
Himik писал(а):
В общем-то ситуация с умножением целых и реальных чисел в x86 разная. Умножение целых чисел всегда даёт удвоенный размер данных, а реальные числа остаются того же размера, поэтому применение каких-либо правил будет конфликтовать либо с одним, либо с другим типом, не поддающимся вашей логике.

Язык высокого уровня должен абстрагировать архитектуру.

А кто-то говорил об обратном страниц эдак 10 назад.

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

Таки и должен или не должен? ;)

Надо четко провести грань от чего мы абстрагируемся, а что специфичное.

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

Размер умножать на число мягко говоря не кашерно. На самом деле требуется, видимо вы забыли математику. Так как операции определены в классе чисел. А между классами их не определяют дабы не плодить сущьностей. Конечно есть исключения.

Тут надо понять какие классы чисел у нас будут а какие не нужны. И стоит ли закладывать расширяемость. К примеру в Си++ из-за этого есть подводные камни. Плохо помню, но к примеру: монотонность(вроде так термин звучит) не гарантируется, а следовательно сравнение a<b b<c не значит a<c и надо учитывать соответственно.

Расширяемость до добра не доводит. Всё равно завтра изобретут новый процессоры с новой архитектурой и будем менять стандарты. Как в свое время было с DirectX при появление видео картами с шейдерами.

К примеру Си типы зависят от архитектуры на которой работаем.
Паскаль один целый тип(тип наибольшей на заданной архитектуре). Остальные являются производными от него.
Verilog 32 бит знаковое с битом переноса.
питон длинные числа

Отличие Си от Паскаля в том что в Си типы ближе к типам хранения данных, а в Паскале это внутренние абстрактные типы.

Zealint писал(а):
Или плавающее число с одинарной точностью на плавающее с бесконечной (тут преобразование типа потребуется). Я подозреваю, что тут нужны особые правила.

Ну не бесконечной, а переменной длины или фиксированной. Не вижу тут особых правил.

Лично мне свистопляска с приведением типов надоела. И хочется простого.
Вижу как бы 2 группы классов чисел
фиксированной длины, переменной длины.
Из фиксированных выделить int64, float64 - 64 в виду современности. - основной базовый тип.
Расширение диапазона/размера чисел не предусматривать.
Для переменной длины предусмотреть расширение.


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

Зарегистрирован: 15 апр 2014, 14:13
Сообщения: 127
Yoda писал(а):
Только не надо опять проталкивать вашу любимую джаву, в которой даже нет беззнаковых типов, в качестве эталона ЯВУ.

На эталон я не претендовал. Но язык мне нравится. Особенно важно - на нём я делю НА МНОГО меньше ошибок. И именно благодаря небольшому набору жёстко соблюдаемых правил. А если мне вдруг понадобится выход на мегаэффективность - я просто вызову из Java ассемблерную функцию (но при этом потеряю переносимость на другие платформы).
Yoda писал(а):
эмбрион писал(а):
Значит в Java придётся делать 32 массива по 2Gb. То есть двумерный массив. В стандарте есть ограничение на размер массива, вытекающее из ограничения на предельное значение 32-битного знакового слова.

Уже по одному этому можно сказать, что Джава - плохой язык, поэтому давайте не будем продвигать его здесь в качестве идеи нового ЯВУ.

Ограничения обходят построением слегка модифицированных алгоритмов. Это просто, стоит только попробовать.

Но почему возникла Java ? Потому что в С все видят кучу недостатков. И опытные программисты на С решили сделать язык лучше С. У них получилась Java. Можно найти недостатки и в их творении, но в нём куча недостатков С реально перестала существовать. Ещё раз заострю - ошибок программист стал делать МНОГО МЕНЬШЕ. Поэтому Java стала популярной среди начинающих программистов, ведь он не даёт косячить так откровенно, как у них получалось на С. А это ведёт к удешевлению процесса разработки. А это в свою очередь ведёт к отмиранию С и превращению его в нишевый язык вроде ассемблера. И при обсуждении новых возможностей для нового языка не стоит забывать этот урок.
Yoda писал(а):
А вот вы, похоже, настолько крепко застряли в своей любви к Джаве, что готовы даже защищать её недостатки и считаете, что ничего лучше быть не может.

Наоборот, мне бы хотелось понять, в чём заключается то лучшее, чего нет в Java. Но приводимые примеры, вращающиеся вокруг скобок и суффиксов меня как-то не убеждают в преимуществах нового.
Yoda писал(а):
Попахивающим учОным требуются языки, которые позволяли бы работать с гигантскими массивами данных без ничем не оправданной потери эффективности на совершенно чуждое архитектуре процессора ограничение в 2Гб на массив и постоянно-периодический сбор мусора.

Здесь вы путаете ограничение процессора с ограничением психологии человека. Вам просто неохота думать про разделение массива на Х частей. Но вспомните про задачи, которые требуют террабайты памяти - вы опять станете настаивать на массивах террабайтной длины ?

И да, мусор можно собирать по умному, то есть программист может вспомнить о такой необходимости и озаботиться минимизацией выделения памяти. Например - можно просто использовать один и тот же массив для работы с разными порциями данных. Это на столько очевидно, что я удивлён, почему вы всё ещё настаиваете на "дикости" недостатков, связанных со сбором мусора.


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

Зарегистрирован: 15 апр 2014, 14:13
Сообщения: 127
Zealint писал(а):
эмбрион писал(а):
Вообще в спецификации указано, что при вычислениях используется тот промежуточный тип, который достаточен для данного значения. А про ошибки переполнения сказано - давить без эксепшенов. Поэтому полностью стандартный компилятор даст 0 вместо 256*256*256*256. Но поскольку вычисление констант происходит на этапе компиляции, а не выполнения, в принципе возможны варианты.

Я считаю, что это неправильно. Ноль - неправильное решение, это очевидно. Наличие разных вариантов - плохое решение, это тоже очевидно, я писал выше о необходимости запретить различные интерпретации одного и того же.

Вот и включите в требование к компилятору вычисление констант с точностью, позволяющей сохранять все значащие цифры. Даже в Java это возможно, но для этого нужен доработанный компилятор. Только такая доработка опять приведёт к нестандартному решению, поэтому надо бы такой подход включить в спецификацию на Java-компиляторы.
Zealint писал(а):
Ваши "весьма редкие" случаи у нас происходят с вероятностью, близкой к 1. У нас и компьютеры, в которых меньше 64 Гб оперативной памяти, принято называть не иначе как детскими игрушечными калькуляторами.

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

И это правильно - учёба всегда доходчивее, если сам на своей любимой голове шишек сначала понабиваешь. Ну а потом некоторые всё же начинают обращать внимание на чужой опыт. Ну да я с этим ни кого не тороплю. :)
Zealint писал(а):
В Java мире нет ни одного человека, который решит на Java хотя бы 3-4 любых задачи, которым я присвою статус "простые". Про "средние" и "сложные" я вообще молчу. Может показаться, что я категоричен, но нет, со мной пытались спорить любители Java, не вышло у них, не смогли. Жду, когда мою категоричность хоть кто-то опровергнет. Хотите попытаться?

Хочу. Но есть важный момент - я, как полный баран в математике, буду задавать кучу глупых вопросов, а вы в ответ заявите - ну вот видите, ещё один Java-писатель нифига не может. Если же вы так по детски не станете меня кидать, то вполне возможно осознаете степень независимости алгоритмов от выбора инструмента. На Java можно эффективно реализовать подавляющее большинство алгоритмов, а что нельзя - и на С будет вряд ли возможно (без ассемблерных вставок, например). Или есть варианты библиотек, задействующие ресурсы вычислителей графических карт, но на Java такие ништяки пока не реализованы. Так что если вы про чистые алгоритмы, а не про использование явно недоступных библиотек - ни разу не проблема реализовать их эффективно на Java.
Zealint писал(а):
Допускаю, что в жабе есть интересные моменты (как и в любом языке, впрочем). Но он нам не подходит. Это не высокопроизводительный язык ни в каком из смыслов, которые тут можно иметь в виду.

Язык Java в разы производительнее С в плане затрат на разработку. Так что как минимум один из смыслов вы упустили.


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

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 241
Откуда: Санкт-Петербург
pavia писал(а):
Отличие Си от Паскаля в том что в Си типы ближе к типам хранения данных, а в Паскале это внутренние абстрактные типы.

Честно говоря, с появлением Delphi под x64 я перестал что-либо понимать. При переходе 16 → 32 бита считалось, что Cardinal и Integer равны разрядности платформы, и я наивно рассчитывал, что стандарт сохранится. На x64 вместо них ввели NativeUInt и NativeInt. Зачем? И почему NativeUInt, а не NativeWord, например? Бред какой-то...

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


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

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

Код:
int72 operator + (int72 a, int72 b) {
  int128 t = a.l + b.l;
  Result.l = int64(t);
  Result.h = a.h + b.h + t>>64;
}

Сергей, я в недоумении. Куда опять дели байт?

Который байт? По-моему, сейчас всё в порядке.

Zealint писал(а):
Я вот тут не согласен. Можно взять и запретить, и наплевать на отзывы. Конечно, тут можно возразить, дескать, я не авторитет, чтобы решать данный вопрос. Но есть вещи, которые нужно отрубать жёстко. Ещё вариант: отступы в языке делать ТОЛЬКО символом tab и никаким больше. Пробел в начале строки будет синтаксической ошибкой. Но блин, это не сработает, так как многие редакторы настраиваются их пользователями так, чтобы tab сразу заменялся на пробелы (у меня это 2 пробела и чхать на всё : ) ) Мы здесь приходим к неоднозначности, в моей концепции (которую я пытаюсь продумать) сказано, что не должно быть никаких неоднозначностей. И здесь вопрос ребром: либо запрещаем tab, либо создаём какие-то совершенно однозначные правила его использования.

Так я и говорю, - вопрос решается отказом от отступов в пользу ограничителей ({}, begin/end или любые другие формы). Это убирает и неоднозначность, и необходимость накладывать какие-либо формальные запреты на табуляции и их трактовку.

Zealint писал(а):
Yoda писал(а):
16-битные целые числа к 32-битным тоже явно приводить?

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

То есть, приходим к выводу, что определённые преобразования типов, которые можно считать условно-безопасными, можно (а с моей точки зрения даже желательно) производить молча, без явного приведения и без замечаний компилятора. Важно только определить класс таких преобразований. В этом смысле C/C++ не так уж и плохи, - если не считать некоторые странности (типа использования целых типов вместо булевого), то современный компилятор без (отключаемых) возражений не даст даже привести беззнаковый тип к знаковому того же размера.

Zealint писал(а):
Yoda писал(а):
А если есть типы, определённые пользователем, с тем же видом отношений между ними?

Пользователь должен прописать правила преобразования (по сути, эту задачу решает конструктор, который нужно указывать явно)

Не существует конструкторов встроенных типов, тем более сложно себе представить конструктор производного от встроенного типа, например, указателя. К тому же, существование конструктора не обязательно означает, что такое преобразование типов можно осуществлять молча (хотя мне пока что не приходит в голову, при каких условиях наличие конструктора не может быть использовано в качестве молчаливого преобразования типа).

Zealint писал(а):
Yoda писал(а):
Код:
cout << static_cast <const char *>(mystr);

Оператор «<<» для ostream придётся прописать для нашей собственной строки, раз мы её определяем.

Да ну, бросьте. Это лишь частный пример, - функций могут быть десятки, даже сотни, вы же не будете их все переопределять только ради того, чтобы избежать постоянного использования вполне безопасного преобразования типа. И данный случай - очень хороший пример такого применения.

Zealint писал(а):
Yoda писал(а):
А если учесть, что результатом умножения всегда является удвоенный размер, нужно ли явно приводить результат к тому же типу после умножения?

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

Ага, значит мы должны согласиться с тем, что иногда должны производиться молча даже небезопасные приведения типов.

Zealint писал(а):
Например, программист может от выражения a*(b*c) хотеть, чтобы в скобках тип на время или навсегда стал удвоенным, чтобы случилось переполнение и отрезание старшей половины, чтобы тип стал не удвоенным, а утроенным. Я не думаю, что эту проблему можно оставить на откуп компилятору. Лучше прописать явно, чего мы хотим. Например,
Код:
int64 a, b, c;
a*int128(b*c) // явно хотим, чтобы b*c имело удвоенный тип.
a*(b*c) // явно хотим, чтобы b*c имело тот же тип.
int128(a*(b*c)) // явно хотим, чтобы b*c имело тот же тип, а умножение на a уже удвоенный.

У Вас имеется более удачный вариант решения проблемы? Я считаю, что приводить тип к int128, а затем выполнять умножение – это пустая трата ресурсов.

Да, я полагаю, что у меня есть удачное решение данной проблемы. Компилятор всегда должен производить результат удвоенной разрядности по всем операциям кроме деления и молча отбрасывать лишние разряды при условии, что целевая разрядность не меньше, чем максимальная разрядность исходных операндов. Поясню на примере.
d = a*(b*c);
Если d - 64-битный, a, b, c - 32-битные, то результат умножения (b*c) будет 64 битным.
Если d - 32-битный, то результат (b*c) - 32-битный.
Если d - 16-битный, то результат (b*c) будет 16-битным (причём, для эффективности лучше умножать только младшие части b и c), но с выводом замечания.
Если d - 32-битный, b и c - 32-битные, a - 64-битное, то результат (b*c) - 32-битный, но с выводом замечания по второй операции т.к. размер операнда a больше размера d.
Собственно, при таком подходе скобки и явные расширяющие приведения типов становятся просто не нужны, т.к. такая логика одновременно гарантирует и корректность результата и эффективность выполнения. Приведение типа к int128 перед умножением - действительно пустая трата ресурсов, но в моём подходе этого и не требуется.

Zealint писал(а):
Yoda писал(а):
А если вспомнить, что даже операции с плавающей точкой как правило приводят к потере точности (а то и к переполнению), нужно ли после каждой операции над числами типа float приводить результат к float?

Если это не следует из контекста, то да. Если написана команда float=float*float, то умножаем как есть с одинарной точностью. Если написано double = float*float, значит нужно обеспечить умножение с удвоенной точностью. Это непривычно для программиста на C++, как и предыдущие примеры, но я лучше не придумал.

Правильно, и это - в точности частный случай предложенной мной выше схемы.

Zealint писал(а):
Хорошо, Ваша точка зрения ясна, но она лежит в области программирования транслятора. Возможно, мало кого из пользователей будет волновать, что транслятор будет чуть сложнее. Моё неприятие подобной записи скорее эмоционально-эстетическое.

Так ведь это тоже аргумент. Моё неприятие префикса 0x - тоже эмоционально-эстетическое.

Zealint писал(а):
Yoda писал(а):
Всё верно. А префиксную запись типа 0xABCD я бы запретил. Да и восьмеричную систему счисления тоже запретил бы. Только два суффикса - b и h.

У Вас есть исследования, которые позволяли бы столь смело выбрасывать восьмеричную систему? Я ни разу за 15 лет ей не воспользовался в реальной программе (если не считать тупых университетских задач, придуманных, видимо, для детей младше 3-х лет).

Нет, исследований у меня нет. Но есть некоторые обоснования.
Начнём с того, что системы счисления непосредственно в коде программы, отличные от десятичной, требуются в основном для системных целей. Математикам они не требуются или требуются только при вводе/выводе.
Далее, восьмеричная система счисления на самом деле имеет чисто исторические корни, т.к. большое количество ранних машин имели 9-битный базовый машинный тип или производный от него (18-битные PDP-1, PDP-4, PDP-7, PDP-9, PDP-15, UNIVAC, IBM 7700, 36-битные - ряд машин IBM, UNIVAC, PDP-6, PDP-10 и ряд других). Для них машинно-зависимые константы действительно было удобней записывать триадами в восьмеричной системе. Но поскольку 9-битность сама по себе выпадает из машинной логики (как не кратная степени двойки, - например, эффективно работать с полем бит в такой системе практически нереально) и полностью отмерла, необходимость в такой записи также отмерла. По тем же причинам нелогичным кажется деление на группы из трёх бит, - тройка не является степенью двойки и также выпадает из машинной логики.
Далее, префиксная запись нулём, принятая в С, - вообще катастрофа. Постфиксная буквой 'o' или 'O' визуально может сливается с 0, что тоже нехорошо.
Наконец, если у нас есть механизм отбивки групп разрядов, то нет никаких проблем вместо восьмеричной системы использовать двоичную - достаточно разбить число на триады. Я бы сказал, что отсутствие в С/С++ двоичных констант - такая же ошибка, как и введение восьмеричных.
Более того, двоичная запись гораздо более полезна, чем восьмеричная и шестнадцатеричная вместе взятые, т.к. в большинстве случаев необходимость в них возникает именно тогда, когда нам нужно манипулировать с группами бит или отдельными битами.

Zealint писал(а):
Yoda писал(а):
Никаких апострофов перед суффиксами. Неоднозначность решается просто, - любое число должно начинаться с цифры. 0ABCDh - число, ABCDh - переменная.

Если честно, то это некрасиво : ) хотя и проще для анализа. И с апострофом тоже не очень. Видимо, придётся пожертвовать здесь красотой.

Красота здесь, вероятно, не главное, более важна понятность. Возьмём три записи: 0badh, bad'h и badh. Только первая запись, очевидно, является числом. Второй вариант уже вызывает серьёзный когнитивный диссонанс, а третий вообще неотличим от идентификатора никакими разумными правилами.

Zealint писал(а):
Во-первых, оператор типа break (как бы его не называли), должен иметь параметр, указывающий, из какого именно цикла мы выходим.

Я так понял из ваших примеров, что break вы хотите распространить и на оператор if, верно? Ваш первый пример не имеет циклов. Если так, то я категорически против, это только запутает логику, уж лучше пользоваться оператором goto. Оператор break должен выходить только из циклов.
Далее. Я согласен, что должен быть механизм задания уровня, однако мне не очень понятно, как его сопрячь с моим механизмом. Дело вот в чём. Оператор break практически всегда используется внутри оператора if. Получается запись следующего типа:
Код:
loop {
  ...
  if (условие) break;
  ...
}

Я считаю, что раз break условный, то и следует его сделать условным оператором. Предыдущая запись в моей логике будет такой:
Код:
loop {
  ...
  break (условие);
  ...
}

Более того, я уже много лет именно так и работаю в С/С++ (включая оператор loop, - в точности как написано), - подобная запись настолько удобна и хорошо воспринимается, что я уже не готов от неё отказаться. Необходимо продумать, как в синтаксисе совместить опциональное задание уровня вложенности с опциональным же условием.

Zealint писал(а):
Разумно (не только циклы, но и условия). Но тогда возникает вопрос: можно ли использовать для именования циклов метки?

Тогда вопрос: а чем это отличается от оператора goto?

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

А нет никаких проблем с логикой. Хорошо, сейчас формализую правила.
- Размер результата умножения равен сумме размеров операндов.
- Размер результата сложения и вычитания равен большему из двух размеров операндов плюс единица.
- Размер результата деления равен размеру делимого.
- Размер результата взятия остатка от деления равен размеру делимого.
- Размер результата возведения в степень равен 128 бит независимо от размеров операндов.
- Если размер целевой размер меньше максимального из двух размеров операндов для сложения/вычитания/умножения, или меньше размера делимого для деления, или меньше размера основания для возведения в степень, то выдаётся предупреждение.
- Если целевой размер меньше результата операции, то старшие значащие разряды отбрасываются.
На машинном уровне можно выполнять любую оптимизацию, не нарушающую эти формальные законы. Например, если результат 32-битный, то можно не использовать 64-битное умножение и не сохранять старшую половину.

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

<<< OS Boot Tools. >>>


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

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 976
Откуда: Дагоба
Himik писал(а):
break действует только на блок цикла (или switch), игнорируя блоки if.

Вообще говоря, использование break в операторе switch - также крайне вредоносная идея. Не надо было этого делать, и сейчас не надо.

Himik писал(а):
Не согласен, потому что вычисление двойной точности происходит в 2 раза медленнее.
При необходимости можно double = (double)float*float.

Скорость в данном случае - вообще не аргумент. Если вы заказали результат типа double, значит вам НУЖЕН результат с такой точностью. Если нужна скорость, приводите результат умножения перед присвоением к типу float.

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

В схеме, предложенной мной, ничего не конфликтует и всё логично.

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

<<< OS Boot Tools. >>>


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

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

Прикольно - обвинять математика в том, что он забыл математику :mrgreen:.
pavia, математики с размерами чисел обычно не работают. Они или считают размер бесконечным или берут логарифм от числа.

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 ... 6, 7, 8, 9, 10, 11, 12 ... 29  След.

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


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

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


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

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