Kuzmich
Гость
|
|
« : 24-10-2003 05:45 » |
|
int n = 1; double d = 1.11; CString str; str.Format)"%.nf", d:; Падает
|
|
|
Записан
|
|
|
|
sh_m
Гость
|
|
« Ответ #1 : 24-10-2003 06:00 » |
|
int n = 1; double d = 1.11; CString str; str.Format)"%.nf", d:; Падает С CString я никогда не работал, но попробуй в кавычках явно указать 1, а не через переменную n: эта запись у тебя точно очень странная.
|
|
|
Записан
|
|
|
|
Kuzmich
Гость
|
|
« Ответ #2 : 24-10-2003 06:45 » |
|
Ну я понимаю, что странная, но мне нужна именно переменная n. А если поставить 1, то все работает. Пока отвечаете, пишу свою функцию для отображения точности
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #3 : 24-10-2003 07:17 » |
|
Напиши в каком виде хочешь ответ получить?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #4 : 24-10-2003 07:24 » |
|
А понял ты хочешь double с точностью n вывести? Долблюсь с утра, с мороза.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 24-10-2003 07:48 » |
|
int n = 1; double d = 1.11; CString str,tmp; tmp.Format)"%%.%df",n:; str.Format)tmp, d:; Вот так нужно. Только в последней строчке может быть ошибка: "как из объекта CString tmp получить указатель на строку".
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #6 : 24-10-2003 08:15 » |
|
Да я то же бы так сделал, с временной форматной строкой. Только в последней строчке может быть ошибка: "как из объекта CString tmp получить указатель на строку". Не понял. Кастинг происходит автоматически. Ну или tmp.GetBuffer()
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #7 : 24-10-2003 08:28 » |
|
Джон, Это хорошо
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Kuzmich
Гость
|
|
« Ответ #8 : 24-10-2003 09:28 » |
|
RXL, все работает. Всем спасибо.
|
|
|
Записан
|
|
|
|
ysv_
Помогающий
Offline
|
|
« Ответ #9 : 24-10-2003 09:37 » |
|
Вообще то, это можно сделать проще: int n = 1; double d = 1.11; CString str; str.Format("%.*lf", n, d);
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #10 : 24-10-2003 10:24 » |
|
ysv_, оно и верно - все умное давно до нас придумали...
You can also specify a precision of '*'. This means that the next argument in the argument list (befor the actual value to be printed) is used as the precision. The value must be an 'int', and is ignored if it is negative. If you specify '*' for both the width and precision, the field width argument precedes the precision argument.
Только я не понял зачем 'l' в "%.*lf"? У CString::Format() иной синтаксис чем у sprintf()?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #11 : 24-10-2003 10:26 » |
|
Век живи - век учись, дураком помрёшь. Это я про себя.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
ysv_
Помогающий
Offline
|
|
« Ответ #12 : 24-10-2003 10:34 » |
|
Только я не понял зачем 'l' в "%.*lf"? У CString::Format() иной синтаксис чем у sprintf()?
Вообще-то я по памяти писал. Насколько помню f - float, lf - double. Или это уже устарело?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #13 : 24-10-2003 10:56 » |
|
Не знаю устарело или как, но у нас, в gnu libc, f - это double, а float преобразовывается в double автоматически. Есль еще long double Lf (80бит). Я подозреваю, что в продуктах MS может быть все иначе.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Migmile
Помогающий
Offline
|
|
« Ответ #14 : 24-10-2003 11:17 » |
|
RXL, Sorry, не понял, в функцию с variable length argument list like Format дляна аргументов определяется по типу. Соответственно в format - по списку формата. Отсюда вопрос - как функция во время выполнения определяет что у нее на входе - float or double. Единственный вариант - компилятор на ее вход всегда подает double - но это вряд-ли!
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #15 : 24-10-2003 11:42 » |
|
Вообщето CStrinf.Format работает 100% как printf стандарт
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #16 : 24-10-2003 11:44 » |
|
Migmile, я сам был удивлен, но в доках написано так. Кстати, gcc проверяет строку формата и список параметров для printf-подобных ф-ий - видимо он и конвертит.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Migmile
Помогающий
Offline
|
|
« Ответ #17 : 24-10-2003 11:56 » |
|
RXL, на самом деле не сложно проверить, посмотрев сколько байт кладется в стек. У меня под руками нет *Nix, да и не знаю как там смотреть - наверное есть опция в компиляторе...
|
|
|
Записан
|
|
|
|
ysv_
Помогающий
Offline
|
|
« Ответ #18 : 24-10-2003 11:58 » |
|
Небольшое исследование в MinGW (использует MSCRT.DLL) показало, что: 1. sizeof(float)=4, sizeof(double)=8, sizeof(long double)=12 (ожидал 10). 2. В printf Независимо от модификатора для f (l, L, h) - double обрабатывается корректно. Аналогично для float. 3. long double обрабывался во всех случаях некорректно . . Впечатление - при вызове функций, которые получают float, аргумент помещается в стек как double.
|
|
|
Записан
|
|
|
|
ysv_
Помогающий
Offline
|
|
« Ответ #19 : 24-10-2003 12:39 » |
|
Вирізка з доки по GCC: Traditional K&R C promotes all floating point operations to double precision, regardless of the sizes of the operands.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #20 : 24-10-2003 13:39 » |
|
Небольшое исследование в MinGW (использует MSCRT.DLL) показало, что: 1. sizeof(float)=4, sizeof(double)=8, sizeof(long double)=12 (ожидал 10). Выравнивание на 4 байта - такие требования оптимизации для Pentium 1..4. Хотя для long double для x86 выравнивание 8 байт 2. В printf Независимо от модификатора для f (l, L, h) - double обрабатывается корректно. Аналогично для float. 3. long double обрабывался во всех случаях некорректно . . Впечатление - при вызове функций, которые получают float, аргумент помещается в стек как double. MinGW - это все же не glibc
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
ysv_
Помогающий
Offline
|
|
« Ответ #21 : 24-10-2003 20:34 » |
|
Выравнивание на 4 байта - такие требования оптимизации для Pentium 1..4.
Давайте не смешивать выравнивание и размер объектов. Для i387 длина long double - 10 соответсвовала размерам регистров. А вот откуда взялось 12? Неужели в новых процессорах размер регистров FPU - 12? Кстати в bcc32 5.5 - размер long double - 10. А в gcc есть опция -m96bit-long-double Set the size of long double to 96 bits as required by the i386 application binary interface. This is the default.
А вот опции для 80 битового длинного double - нет
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #22 : 24-10-2003 21:07 » |
|
Давайте не смешивать выравнивание и размер объектов. Для i387 длина long double - 10 соответсвовала размерам регистров. А вот откуда взялось 12? Неужели в новых процессорах размер регистров FPU - 12?
Назави размер "a". По твоему sizeof() должен быть 120.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Kuzmich
Гость
|
|
« Ответ #23 : 27-10-2003 06:32 » |
|
Вообще то, это можно сделать проще: int n = 1; double d = 1.11; CString str; str.Format("%.*lf", n, d); Прекрасно работает, спасибо. Век живи - век учись, дураком помрёшь. Чем больше я знаю, тем больше я незнаю
|
|
|
Записан
|
|
|
|
NetRaider
Гость
|
|
« Ответ #24 : 27-10-2003 06:44 » |
|
Отсюда вопрос - как функция во время выполнения определяет что у нее на входе - float or double. Единственный вариант - компилятор на ее вход всегда подает double - но это вряд-ли!
Впечатление - при вызове функций, которые получают float, аргумент помещается в стек как double.
При вызове функции с переменным чилом параметров, аргумент типа float всегда преобразуется к double (5.2.2/7)
|
|
|
Записан
|
|
|
|
|