Разработка, производство и продажа радиоэлектронной аппаратуры
|
Карта сайта
|
Пишите нам
|
В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:
jobsmp@pochta.ru
Телесистемы
|
Электроника
|
Конференция «Микроконтроллеры и их применение»
Проблема получения целой части в переменных с плавающей точкой float / doub...{+}(+)
Отправлено
математика
11 января 2008 г. 11:55
Текст заголовка сообщения полностью:
Проблема получения целой части в переменных с плавающей точкой float / double в языке Си
Проблема получения целой части в переменных с плавающей точкой float / double в языке Си
Имеем
#include <stdio.h>
int main ()
{
double n;
int b = sscanf ("123.44", "%10lf", &n);
n = long (n * 100) / 100.;
printf ("%10.3lf\n", n);
return 0;
}
на входе / на выходе
123.45 / 123.45
123.44 / 123.43
должно быть всегда вход == выходу.
Как решить ?
PS: решение уже нашел, но не самое лучшее.
Составить ответ
|
Вернуться на конференцию
Ответы
А если так(+)
—
KG
(11.01.2008 13:45:52
193.34.10.124
, 119 байт)
Мдя.... Си - это круто.... Не то что какие-то там ассемблеры....
—
argus98
(11.01.2008 13:01:14
81.22.205.230
,
пустое
)
Причём тут С ?
—
miv
(11.01.2008 13:59:18
213.170.82.250
,
пустое
)
не только Си, круты те кто придумал плавающую точку, вернее пьяную точку.
—
математика
(11.01.2008 13:13:36
65.110.6.33
,
пустое
,
ссылка
)
Круты те кто в школе плохо учился ;) Без обид ;) ! Ок ?
—
miv
(11.01.2008 13:52:28
213.170.82.250
,
пустое
)
а я об чем, двоешники плавающую точку делали.
—
математика
(11.01.2008 14:09:53
65.110.6.35
,
пустое
)
Ну ! Ну ! =))
—
miv
(11.01.2008 14:11:44
213.170.82.250
,
пустое
)
printf ("%10.3lf\n", n); запишите вот так printf ("%10.3f\n", n);
—
omen
(11.01.2008 12:43:5
212.176.3.10
,
пустое
)
и на выходе получаю 0.000, т.к. для double надо %lf а для float %f
—
математика
(11.01.2008 12:46:58
65.110.6.35
, 38 байт)
да, сорри
—
omen
(11.01.2008 12:49:38
212.176.3.10
,
пустое
)
просто 123.44 на самом деле выглядит (+)
—
koyodza
(11.01.2008 12:41:23
195.214.197.203
, 153 байт)
значит преобразование типов работает не верно.
—
математика
(11.01.2008 12:55:1
65.110.6.33
,
пустое
)
все верно, koyodza правильно сказал процесс выглядит так (+)
—
omen
(11.01.2008 13:03:21
212.176.3.10
, 163 байт)
принф имхо, должно округлять, а не отбрасывать
—
omen
(11.01.2008 12:43:55
212.176.3.10
,
пустое
)
так отбрасывает не printf, а строка n = long (n * 100) / 100.;
—
koyodza
(11.01.2008 12:54:36
195.214.197.203
,
пустое
)
вообще, те варианты, которые были ниже они правильные :) но я пишу у себя так (+)
—
omen
(11.01.2008 13:00:23
212.176.3.10
, 68 байт)
а я так n = long (n * 100 + 0.001) / 100.;
—
математика
(11.01.2008 13:04:1
65.110.6.36
,
пустое
)
хочу заметить, мне нужно не округление floor ceil, хотя и оно горбатое для ...{+}
—
математика
(11.01.2008 12:34:4
65.110.6.44
, 222 байт)
А floor() использовать не судьба?
—
vmp
(11.01.2008 12:22:34
87.245.155.195
,
пустое
)
Это для студней =)
—
miv
(11.01.2008 12:26:55
213.170.82.250
,
пустое
)
по идее n = ((long)(n*100.))/100
—
SM
(11.01.2008 12:22:34
80.92.255.53
,
пустое
)
а вообще есть специальная ф-ции floor/ceil
—
SM
(11.01.2008 12:23:16
80.92.255.53
,
пустое
)
Написать вот так n = long (n * 100) / 100. + 0.005; Хотя вообще это странно..
—
omen
(11.01.2008 12:06:6
212.176.3.10
,
пустое
)
правильнее n = long (n * 100+0.5) / 100
—
CTAC
(11.01.2008 14:06:23
213.132.77.153
, 150 байт)
тогда честнее будет так n = long (n * 100+0.555555555) / 100
—
математика
(11.01.2008 14:12:27
65.110.6.33
,
пустое
)
Ничо странного =)) Разрядная сетка-то не бесконечная =))
—
miv
(11.01.2008 12:21:25
213.170.82.250
,
пустое
)
т.е. 5 десятичных чисел он уже не способен в long-е хранить ??? или в double ???
—
математика
(11.01.2008 12:35:55
65.110.6.36
,
пустое
)
В одной переменной да же БОГ не способен хранить несколько ЧИСЕЛ =) "Я так думаю" (c)
—
miv
(11.01.2008 12:55:48
213.170.82.250
,
пустое
)
да что Вы говорите? не знал, что я - бог, да ещё многие другие
—
argus98
(11.01.2008 13:03:2
81.22.205.230
,
пустое
)
От скромности точно не умрёте =)) Ну ка ! А посмотреть ?? (+)
—
miv
(11.01.2008 13:46:45
213.170.82.250
, 90 байт)
PS 1234*(2^12) + 2345 размещаются в 24-бит переменной (+):
—
argus98
(11.01.2008 14:04:11
81.22.205.230
, 62 байт)
=))) (+)
—
miv
(11.01.2008 14:09:23
213.170.82.250
, 182 байт)
использую числа однобитовые, двухбитовые, трех-... и т.д. Прекрасно размещаются в одной переменной, лишь бы битов хватало (+):
—
argus98
(11.01.2008 13:59:39
81.22.205.230
, 89 байт)
Но речь в вопросе идёт о десятичной, на сколько я понял !
—
miv
(11.01.2008 14:03:30
213.170.82.250
,
пустое
)
в нашем деле НЕТ никакой ДЕСЯТИЧНОЙ системы, есть только ДВОИЧНАЯ, всё остальное - надстройка на ней со всеми последствиями
—
koyodza
(11.01.2008 18:07:6
195.214.197.203
,
пустое
)
И кстати ! математика обшибся (+)
—
miv
(11.01.2008 14:06:33
213.170.82.250
, 164 байт)
В "С" для этого битовые поля придуманы !
—
miv
(11.01.2008 14:01:48
213.170.82.250
,
пустое
,
ссылка
)
Они конечно зашибись, но операцию & к ним сделать нельзя будет...
—
Quasy
(11.01.2008 16:18:24
80.243.9.34
,
пустое
)
Прошу учесть не цифр а чисел ;)
—
miv
(11.01.2008 13:49:4
213.170.82.250
,
пустое
)
Кстати ! Ниже это частный случай (+)
—
miv
(11.01.2008 13:56:30
213.170.82.250
, 215 байт)
А ну да, ну да ! 0,1,2,3,4,5,6,7,8,9 вырожденные числа =)))
—
miv
(11.01.2008 13:50:7
213.170.82.250
,
пустое
)
а если вспомнить про комплексные числа ? :-)
—
математика
(11.01.2008 12:57:55
65.110.6.44
,
пустое
)
И чо ? (+)
—
miv
(11.01.2008 13:48:7
213.170.82.250
, 141 байт)
а помнишь задачку, как имея всего две переменные, поменять их местами ? не ...{+}
—
математика
(11.01.2008 14:08:0
65.110.6.44
, 174 байт)
Странно что я даже знаю как =))) !Но причём здесь это ? И кстати от архитектуры проца зависит !
—
miv
(11.01.2008 14:11:1
213.170.82.250
,
пустое
)
так и сделал, только +0.00001, но проблема остается
—
математика
(11.01.2008 12:10:22
65.110.6.33
, 66 байт)
Компьютер, сволочь, в двоичной системе считает и разрядов двоичных у него мало, как справедливо замечено выше:-))
—
-=ВН=-
(11.01.2008 12:26:28
217.23.20.86
,
пустое
)
Еще непонятно, зачем там приведение к лонгу? оно вообще там лишнее. Возможно, принтф глючит..
—
omen
(11.01.2008 12:13:36
212.176.3.10
,
пустое
)
Отправка ответа
Имя*:
Пароль:
E-mail:
Тема*:
Сообщение:
Ссылка на URL:
URL изображения:
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
вычтите из двух единицу:
Перейти к списку ответов
|
Конференция
|
Раздел "Электроника"
|
Главная страница
|
Карта сайта
Web
telesys.ru