Страниц: 1 [2] 3 4 ... 6
  Печать  
Автор Тема: long double  (Прочитано 38200 раз)
oder
Гость
« Ответ #15 : Октября 28, 2009, 01:20:32 pm »

Borland C/C++ 3.1 for DOS: sizeof(long double)=10
Borland C/C++ 5.5 for Win32: sizeof(long double)=10
GCC 3.4.4 for CygWin: sizeof(long double)=12 (это dword align влияет, а так обычный 80 bit precision)
GCC 2.95.3 for QNX 6.3.2: sizeof(long double)=12
GCC 3.3.5 for QNX 6.3.2: sizeof(long double)=12
Visual Studio 2005: sizeof(long double)=8
Visual Studio 2008: sizeof(long double)=8

Больше под рукой нет ничего проинсталенного, чтобы не менят винты на машине, но думаю, что и этого хватит.

Ну так вот! Стандарт запрещает хранить результаты операций с 10-байтовыми величинами в 10-байных переменных. Потому что, реально, ничего, кроме сложения, вычитания и умножения/деления на степень двойки ты с ними делать не можешь. Всё остальное тебе даст ошибку в младших битах мантисы и результат будет ничем не лучше, чем у тех же 64 бит. 10-байт - это обычные "понты", чтоб место под long double не пропадало даром. Их НУЖНО принудительно обрезать до 64 бит после каждой серии операций, чтоб вычислительная ошибка обрезалась, а не накапливалась до бесконечности. 8-байтные величины при 10-байтных вычислениях гарантируют, что в вычислениях будут принимать участвие только точные биты.
« Последнее редактирование: Октября 28, 2009, 01:22:56 pm от oder » Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #16 : Октября 28, 2009, 01:37:35 pm »

Borland C/C++ 3.1 for DOS: sizeof(long double)=10
Borland C/C++ 5.5 for Win32: sizeof(long double)=10
GCC 3.4.4 for CygWin: sizeof(long double)=12 (это dword align влияет, а так обычный 80 bit precision)
GCC 2.95.3 for QNX 6.3.2: sizeof(long double)=12
GCC 3.3.5 for QNX 6.3.2: sizeof(long double)=12
Visual Studio 2005: sizeof(long double)=8
Visual Studio 2008: sizeof(long double)=8

Больше под рукой нет ничего проинсталенного, чтобы не менят винты на машине, но думаю, что и этого хватит.

Ну так вот! Стандарт запрещает хранить результаты операций с 10-байтовыми величинами в 10-байных переменных.

Где это сказано ?

10-байт - это обычные "понты", чтоб место под long double не пропадало даром.

Нет, не понты. То, что ты называешь ошибкой, называется precision. Я когда занимался вычислениями в универе, то пришлось использовать long double, так как промежуточные значения без нормализации теряли точность.
Записан

oder
Гость
« Ответ #17 : Октября 28, 2009, 01:41:58 pm »

Ну ты понимаешь, что в новых студиях вообще додали опцию для принудительного сохранения-загрузки из памяти после каждой операции, чтоб было соответствие стандарту. Ты можешь иметь себе long double 10 байт, но для этого тебе надо внутренне вычисления проводить хотя бы в 14 байтах. Иначе толку тебе от того результата, если он имеет кучу знаков, но половина из них - неправильные!
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #18 : Октября 28, 2009, 03:09:46 pm »

То ты не про то говоришь, ты говоришь о паре частных требований стандарта, касательно работы с округлениями. Этим C99 стандарт пытается унифицировать работу с floating point на разных аппаратных платформах. x86 и long double здесь совершенно ни при чём.

Ты хочешь сказать что SSE2 FPU не IEEE 754 conformant так как все операции с floating point они проводят именно с той точностью, которая определена типом ? Для Intel это будет новостью.
Записан

Dukales
Jr. Member
**
Offline Offline

Сообщений: 64


Просмотр профиля
« Ответ #19 : Октября 28, 2009, 03:35:34 pm »

Не собираюсь ни с кем спорить. Мне за это денег не плотят.
уже не актуально Wink
Ура новому пророку!
Wink
Есть long double и в С и в С++ стандартах.
я подозревал это. Ну не могло быть иначе. Страуструп в своих филосовских замечаниях был прав.
Ты можешь иметь себе long double 10 байт, но для этого тебе надо внутренне вычисления проводить хотя бы в 14 байтах.
неверно.
http://learning.itsoft.ru/coding/first/lab00/Kosvennie.html
Таким образом при сложении - только последний бит не является в общем случае верным, а не (14 -12)*8 = 16.
Ну так вот! Стандарт запрещает хранить результаты операций с 10-байтовыми величинами в 10-байных переменных. Потому что, реально, ничего, кроме сложения, вычитания и умножения/деления на степень двойки ты с ними делать не можешь. Всё остальное тебе даст ошибку в младших битах мантисы и результат будет ничем не лучше, чем у тех же 64 бит. 10-байт - это обычные "понты", чтоб место под long double не пропадало даром. Их НУЖНО принудительно обрезать до 64 бит после каждой серии операций, чтоб вычислительная ошибка обрезалась, а не накапливалась до бесконечности. 8-байтные величины при 10-байтных вычислениях гарантируют, что в вычислениях будут принимать участвие только точные биты.
http://wasm.ru/forum/viewtopic.php?id=34458
разберитесь - здесь контрпример к вашему утверждению
Записан

Это предложение содержит двенадцать слов, двадцать шесть слогов и семьдесят три буквы
oder
Гость
« Ответ #20 : Октября 28, 2009, 04:05:03 pm »

неверно.
http://learning.itsoft.ru/coding/first/lab00/Kosvennie.html
Таким образом при сложении - только последний бит не является в общем случае верным, а не (14 -12)*8 = 16.

Не хочу ругаться матом, но про сложение, вычитание и деление/умножение на степени двойки я упоминал.
Надеюсь это Вы возьмете на себя обязанность контролировать весь мир, чтоб они, случайно, корень квадратный не посчитали? А то ж надо кому-то отвечать, если потом результат выйдет неточным и кто-нибудь выступит с претензиями, что его обманули относительно исключительной продвинутости long double и он потратил лишних 2 доллара на закупку шифера для своей треугольной крыши.
« Последнее редактирование: Октября 28, 2009, 04:07:42 pm от oder » Записан
Dukales
Jr. Member
**
Offline Offline

Сообщений: 64


Просмотр профиля
« Ответ #21 : Октября 28, 2009, 04:19:18 pm »

ну уж...
никто не использует все значащие "цифры" (мб только в олимпиадных задачках?). да и крыши с точностью 17 значащих цифр никто не инженерит (допустим круглые: ведь уже 10 значащих цифр числа pi позволяют вычислить длину экватора Земли через радиус с точностью до миллиметров).
а указаный мной контрпример как раз показывает для чего нужны эти, быть может и округляемые при выводе (это легитимно, если мы вводим с соответственной точностью), разряды. В одной задаче могут присутствовать числа разных порядков малости - это нормально.
« Последнее редактирование: Октября 28, 2009, 04:32:50 pm от Dukales » Записан

Это предложение содержит двенадцать слов, двадцать шесть слогов и семьдесят три буквы
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #22 : Октября 28, 2009, 04:22:50 pm »

Надеюсь это Вы возьмете на себя обязанность контролировать весь мир, чтоб они, случайно, корень квадратный не посчитали? А то ж надо кому-то отвечать, если потом результат выйдет неточным и кто-нибудь выступит с претензиями, что его обманули относительно исключительной продвинутости long double и он потратил лишних 2 доллара на закупку шифера для своей треугольной крыши.

Когда даже профессиональные 3D акселераторы для растеризации трёхмерного мира используют аппаратно 32бит float в качестве координат, то как-то два лишних доллара на шифер из-за long double смотрятся смешно Smiley
Записан

oder
Гость
« Ответ #23 : Октября 28, 2009, 04:24:24 pm »

никто не использует все значащие "цифры" (мб только в олимпиадных задачках?).

Так зачем их тогда считать, если их никто не использует? Зачем long double вообще?
Записан
oder
Гость
« Ответ #24 : Октября 28, 2009, 04:28:15 pm »

Когда даже профессиональные 3D акселераторы для растеризации трёхмерного мира используют аппаратно 32бит float в качестве координат, то как-то два лишних доллара на шифер из-за long double смотрятся смешно Smiley
3D акселераторы используют float потому, что:
1) Они берегут ресурсы
2) Результирующее значение всё-равно, загрубится до количества пикселов на экране. И даже, в большинстве случаев, не принципиально, попадет ли объект на свое место или он на один-два пиксела "промажет".

P.S. Но прошу заметить! float при этом никого не обманывает и свою обещанную точность держит.
P.P.S. Просто, хилая она у него.  Wink
« Последнее редактирование: Октября 28, 2009, 04:31:46 pm от oder » Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #25 : Октября 28, 2009, 04:31:55 pm »

никто не использует все значащие "цифры" (мб только в олимпиадных задачках?).

Так зачем их тогда считать, если их никто не использует? Зачем long double вообще?

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

oder
Гость
« Ответ #26 : Октября 28, 2009, 04:34:52 pm »

Так зачем их тогда считать, если их никто не использует? Зачем long double вообще?

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

Ещё раз объясняю. Точностью называется количество достоверных знаков, а не количество знаков вообще.
Записан
Dukales
Jr. Member
**
Offline Offline

Сообщений: 64


Просмотр профиля
« Ответ #27 : Октября 28, 2009, 04:38:57 pm »

Для промежуточных вычислений, где точность double уже на каких-то промежуточных этапах не устраивает.
вот это как раз о разных порядках точности, присутствующих в одной задаче.
Записан

Это предложение содержит двенадцать слов, двадцать шесть слогов и семьдесят три буквы
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #28 : Октября 28, 2009, 04:41:08 pm »

2) Результирующее значение всё-равно, загрубится до количества пикселов на экране. И даже, в большинстве случаев, не принципиально, попадет ли объект на свое место или он на один-два пиксела "промажет".

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

oder
Гость
« Ответ #29 : Октября 28, 2009, 04:47:00 pm »

Тут более важно придерживаться "неконфликтующих" правил округления.
А при правильном выборе единиц измерения точности, float (6 знаков) для игорной 3D графики вролне хватает.

Да и antialiasing все спрячет... Wink
« Последнее редактирование: Октября 28, 2009, 04:53:12 pm от oder » Записан
Страниц: 1 [2] 3 4 ... 6
  Печать  
 
Перейти в: