Здравствуйте, LaptevVV, Вы писали:
LVV>Билловская контора реализовала long double как double из соображений переносимости. Дело в том, что double — это международный стандарт IEEE, тогда как long double — это расширение Intel.
Кстати, то, что это именно расширение, показывает наличие ключа -[Q]long_double у интеловского компилера (без этого sizeof(long double)==8, с этим — 10).
Самое большая неприятность — невозможность даже при этом распечатать long double с помощбю printf'а (на win32) — так как там плавающие числа передаются всегда как double (даже если это float)... Linux рулит.
Почему sizeof(long double) = 8?
От:
Аноним
Дата:
08.10.04 05:32
Оценка:
Почему sizeof(long double) = 8? Ведь sizeof(double) тоже = 8. Какой, тогда, смысл в LONG double? (в .NET'е)
Здравствуйте, <Аноним>, Вы писали:
А>Почему sizeof(long double) = 8? Ведь sizeof(double) тоже = 8. Какой, тогда, смысл в LONG double?
Мои предположения таковы что очень давно long double отличался от double размером, а затем его оставили для совместимости со старыми исходника..
MSDN пробормотал что мол Type double is a floating type that is larger than or equal to type float, but shorter than or equal to the size of type long double.
Есть ещё что добавить? А> (в .NET'е)
managed C++?
... << RSDN@Home 1.1.4 beta 3 rev. 185 писалось под звуки Estatic Fear — Chapter IV>>
Здравствуйте, <Аноним>, Вы писали:
А>Почему sizeof(long double) = 8? Ведь sizeof(double) тоже = 8. Какой, тогда, смысл в LONG double? (в .NET'е)
потому, что стандарт не оговаривает сколько байт должен занимать float, double и long double. Требуется только чтобы точность float была не меньше, чем у double, а у double не меньше, чем у long double, а также чтобы множество значений float было подмножеством множества значений double, а множество значений double было подмножеством множества значений long double.
см. 3.9.1/8
There are ther floating point types: float, double, and long double. The type double provides at least as much precision as float, and the type long double provides at least as much precision as double. The set of values of the type float is a subset of the set of values of the type double; the set of values of the type double is a subset of the set of values of the type long double. The value representation of floating-point types is implementation-defined. Integral and floating types are collectively called arithmetic types. Specializations of the standard template numeric_limits (18.2) shall specify the maximum and minimum values of each arithmetic type for an implementation.
Здравствуйте, Аноним, Вы писали:
А>Почему sizeof(long double) = 8? Ведь sizeof(double) тоже = 8. Какой, тогда, смысл в LONG double? (в .NET'е)
Билловская контора реализовала long double как double из соображений переносимости. Дело в том, что double — это международный стандарт IEEE, тогда как long double — это расширение Intel. Чтоб было меньше проблем с возможным переносом (мало ли как long double реализован на других компьютерах) они поступили так. Но как тип double и long double различаются в соответствии со стандартом С++.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Почему sizeof(long double) = 8?
От:
Аноним
Дата:
08.10.04 06:21
Оценка:
Здравствуйте, Peregrin, Вы писали:
P>Требуется только чтобы точность float была не меньше, чем у double, а у double не меньше, чем у long double, ...
P>
см. 3.9.1/8
P>There are ther floating point types: float, double, and long double. The type double provides at least as much precision as float, and the type long double provides at least as much precision as double....
Насколько я понял из стандарта, точность double должна быть не ниже точности float, а точность long double не ниже точности double.
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Peregrin, Вы писали:
P>>Требуется только чтобы точность float была не меньше, чем у double, а у double не меньше, чем у long double, ...
P>>
см. 3.9.1/8
P>>There are ther floating point types: float, double, and long double. The type double provides at least as much precision as float, and the type long double provides at least as much precision as double....
А>Насколько я понял из стандарта, точность double должна быть не ниже точности float, а точность long double не ниже точности double.
Правильно понял Это я попутал когда писал Все-таки спать по 6 часов в сутки — это мало для меня
Здравствуйте, Antikrot, Вы писали:
A>Здравствуйте, LaptevVV, Вы писали:
LVV>>Билловская контора реализовала long double как double из соображений переносимости. Дело в том, что double — это международный стандарт IEEE, тогда как long double — это расширение Intel. A>Кстати, то, что это именно расширение, показывает наличие ключа -[Q]long_double у интеловского компилера (без этого sizeof(long double)==8, с этим — 10). A>Самое большая неприятность — невозможность даже при этом распечатать long double с помощбю printf'а (на win32) — так как там плавающие числа передаются всегда как double (даже если это float)... Linux рулит.
Здравствуйте, e-Xecutor, Вы писали:
EX>printf("%Lf\n",3.13L);
А разница?
printf("%.18Lf",3.1111111111111111111L);
обрезает как double. то есть 3.11111111111111200.
как и:
printf("%.18f",3.1111111111111111111);
реально код в обоих случаях идентичен (передается по 8 байт)
Имеется в виду именно win32. Я знаю, что на lin(32|64) %lf нормально работает.
Re[5]: Почему sizeof(long double) = 8?
От:
Аноним
Дата:
08.10.04 10:05
Оценка:
A>А разница? A>printf("%.18Lf",3.1111111111111111111L); A>обрезает как double. то есть 3.11111111111111200. A>как и: A>printf("%.18f",3.1111111111111111111); A>реально код в обоих случаях идентичен (передается по 8 байт)
Так это потому что long double в Visual C++ и есть 8 байт, но как типы они разные.
Здравствуйте, Аноним, Вы писали: А>Так это потому что long double в Visual C++ и есть 8 байт, но как типы они разные.
Ну значит кто-то неправильно кого-то понял.
Я понял так, что %Lf печатает именно long double (80bit), и не в VC32, а в win32 — немного другая вещь.
То, что в vc double то же что и long double, я знаю (ну блин, работа такая
Меня интересует, есть ли под win какой-нить компилятор (или либа), где printf печатает long double именно как 80битное число.
Re[7]: Почему sizeof(long double) = 8?
От:
Аноним
Дата:
08.10.04 10:57
Оценка:
А>>Так это потому что long double в Visual C++ и есть 8 байт, но как типы они разные. A>Ну значит кто-то неправильно кого-то понял.
Вот и я думаю, кто из нас кого не понял.
A>Я понял так, что %Lf печатает именно long double (80bit), и не в VC32, а в win32 — немного другая вещь.
%Lf и печатает long double, и занимай long double 10 байт, то соответственно 10 байт и были бы положены в стек и 10 байт бы и использовались при распечатке!
При чем тут Win32 — не догоняю. Компилятор поддерживает понятие long double а не ОСь.
A>То, что в vc double то же что и long double, я знаю (ну блин, работа такая
Размеры они занимают одинаковые, но типы это абсолютно разные. Работа точно такая же как и у тебя!
A>Меня интересует, есть ли под win какой-нить компилятор (или либа), где printf печатает long double именно как 80битное число.
Лучше поставь вопрос иначе, чтобы правильно тебя понимали. "Меня интересует есть ли под Вин какой-нибудь компилятор в котором long double занимает 10 байт?" Либа тут не при чем. Будет 10 байт — будут 10 и использоваться при распечатке!
Здравствуйте, Antikrot, Вы писали:
A>Самое большая неприятность — невозможность даже при этом распечатать long double с помощбю printf'а (на win32) — так как там плавающие числа передаются всегда как double (даже если это float)... Linux рулит.
Неправда! Фактические параметры типа float, приходящиеся на "..."-часть прототипа функции, действительно продвигаются в типе до double (так требует стандарт языка). Аналогично типы [signed/unsigned] char и [unsigned] short int продвигаются до [unsigned] int. Но вот сужение типа не выполняется ни при каких условиях.
В printf для работы с long double есть модификатор "L", например: "%Lf", "%10.3Lf".
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Здравствуйте, Аноним, Вы писали:
Да ладно, не ругайся... А>"Меня интересует есть ли под Вин какой-нибудь компилятор в котором long double занимает 10 байт?"
Я и сам знаю, что есть. Знаю какой.
Мне нужна именно возможность печатать printf'ом 10-байтные даблы, а не поддержка их компилятором как 10-байтные. Собственно printf — не часть компилятора, посему и слова про либы сказал.
Re[9]: Почему sizeof(long double) = 8?
От:
Аноним
Дата:
08.10.04 12:34
Оценка:
А>>"Меня интересует есть ли под Вин какой-нибудь компилятор в котором long double занимает 10 байт?" A>Я и сам знаю, что есть. Знаю какой. A>Мне нужна именно возможность печатать printf'ом 10-байтные даблы, а не поддержка их компилятором как 10-байтные. Собственно printf — не часть компилятора, посему и слова про либы сказал.
printf() — часть библиотеки, которая должна поддерживаться компилятором если он поддерживает стандарт. Если в компиляторе на long double приходятся 10 байт, то соответсвенно 10 байт и будут положены в стек и %Lf будет использовать 10 байт. В противном случае (если long double урезается до double, как ты говоришь), будет потеря в precision, что не есть гут. Кстати, стримы в С++ пробовал?
Здравствуйте, Antikrot, Вы писали:
A>Мне нужна именно возможность печатать printf'ом 10-байтные даблы, а не поддержка их компилятором как 10-байтные.
Это как?
A>Собственно printf — не часть компилятора, посему и слова про либы сказал.
Функция printf — не часть компилятора, но часть комлектации компилятора. И неотрывно с ним связана. Если в данном компиляторе long double совпадает с double, то, если бы функция printf делала бы вид, что это не так, ничего хорошего бы не получилось. И наоборот.
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Аноним, Вы писали:
А>>Почему sizeof(long double) = 8? Ведь sizeof(double) тоже = 8. Какой, тогда, смысл в LONG double? (в .NET'е) LVV>Билловская контора реализовала long double как double из соображений переносимости. Дело в том, что double — это международный стандарт IEEE, тогда как long double — это расширение Intel.
Не понял. C++ типы double и long double не имеют никакого отношения к стандарту IEEE. Т.е. они могут быть реализованы в соответствии с этим стандартом, но это не обязательно.
LVV> Чтоб было меньше проблем с возможным переносом (мало ли как long double реализован на других компьютерах) они поступили так.
На других компьютерах и тип double может иметь другие свойства.
LVV>Но как тип double и long double различаются в соответствии со стандартом С++.