imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 01.08.2003, 08:47     # 1
naumenko
Newbie
 
Регистрация: 13.04.2003
Сообщения: 37

naumenko Путь к славе только начался
Exclamation Проблема при конвертация float->int !!!

Вот кусочек кода:

.
.
.
int devider=10;
int ascii_of_current_symbol;
float converted_symbol;
int int_part;
float float_part;
int container;

current_symbol=(TCHAR)m_strName.GetAt(some_position);
ascii_of_current_symbol=__toascii(current_symbol);
.
.
.
converted_symbol=(float)ascii_of_current_symbol/devider;
int_part=converted_symbol;
float_part=(converted_symbol-int_part)*devider;
container=(int)float_part;
container=container^some_position+2;
.
.
.


Проблема в этой строке:

container=(int)float_part;

Например (по шагам):

current_symbol='w'
ascii_of_current_symbol=119
converted_symbol=11.9000
int_part=11
float_part=9.0000
container=8
.
.
.


Какого рожна 9.0000 преобразуется в 8 ???!!!
Помогите пожалуйста!


Заранее благодарен.
naumenko вне форума  
Старый 01.08.2003, 10:17     # 2
aleh
Junior Member
 
Регистрация: 27.12.2002
Адрес: Belarus
Сообщения: 129

aleh Путь к славе только начался
Это нормально. Есть две причины:
1) При выводе float округляется, а при преобразовании в int происходит отсечение дробной части. Так 8.99995 при выводе только 4-х знаков после запятой напечатается как 9.0000, а при отсечении дробной части получится 8.
2) C/С++ работает с памятью без особой осторожности и при преобразовании в int просто берёт что содержится на месте float. Только при этом вместо 8 должна быть полная ересь (числа с плавающей запятой представляются весьма хитро).

Выход => Незнаю, но вроде должна быть процедура по преобразованию float в int, её нужно слегка дополнить, что-то типа float2int(float_number + 0.5) -- однозначного отображения вещественных чисел на целые нет, но хотябы погрешность будет не более 0.5 (хотя возможны артефакты, так как с точки зрения вещественных чисел 0.5 может и не быть, а есть 0.4999999999 или 0.500000001
aleh вне форума  
Старый 26.05.2006, 14:21     # 3
Tano
Junior Member
 
Аватар для Tano
 
Регистрация: 01.05.2004
Сообщения: 175

Tano Известность не заставит себя ждать
Скажите, как при считывании инфы из файла в char'овский массим потом переконвертить его в int или double?
Спасибо
__________________
Don't keep your mind in a [frame]!
Tano вне форума  
Старый 26.05.2006, 16:09     # 4
Kvarx
Member
 
Регистрация: 26.09.2005
Адрес: Питер
Сообщения: 336

Kvarx Известность не заставит себя ждатьKvarx Известность не заставит себя ждать
Tano
ты считываешь каждый символ из файла в соответствующий элемент массива? Что ты теперь хочешь сделать?

1) из нескольких элементов массива составить число?
2) или каждый элемент массива перегнать в число?
Kvarx вне форума  
Старый 26.05.2006, 16:38     # 5
GOre01
Junior Member
 
Аватар для GOre01
 
Регистрация: 10.08.2004
Адрес: Завис в конторе
Пол: Male
Сообщения: 180

GOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царствеGOre01 Луч света в тёмном царстве
to Tano
самое простое, что приходит в голову.
ты считываешь данные, скажем, из файла:
Код:
...
ifstream f("somefile.txt");
#define MAXNUMCHAR 25
char numBuf[MAXNUMCHAR]; // максимум 24 символа в числе + 1 на '\0'
int realReadByte;
while (!f.eof())
{
    f.get(numBuf, 24);
    realReadByte = f.tellg();
    numBuf[realReadByte] = '\0';
    // а дальше, если число целое используешь
    cout << endl << atoi(numBuf); // atoi(char *) переводит строку символов в число
    // если число дробное
    cout << endl << atof(numBuf); 
}
f.close();
...
это только пример. надо делать проверку на символы в считанном буфере, проверять на то, какое это число (целое или дробное) и т.п.

функций, переводящих строку в число бульше, чем я написал, остальное можно посмотреть в справке.
__________________
Не нервируйте меня. Мне скоро негде будет прятать трупы!
GOre01 вне форума  
Старый 27.05.2006, 23:28     # 6
Tano
Junior Member
 
Аватар для Tano
 
Регистрация: 01.05.2004
Сообщения: 175

Tano Известность не заставит себя ждать
Kvarx, элемент записываются в массив, например 1.1 и сразу переводится в double..в принципе GOre01 понятно объяснил - спасибо, я попробую уже сам.
__________________
Don't keep your mind in a [frame]!
Tano вне форума  
Старый 28.05.2006, 01:40     # 7
ktulu
Junior Member
 
Аватар для ktulu
 
Регистрация: 21.04.2005
Сообщения: 117

ktulu Путь к славе только начался
Насколько я помню, округление при преобразовании float->int всегда в меньшую сторону. Если не жалко времени (не своего, а затрачиваемого на выполнение проги), то или юзай floor()/ceil(), или используй вариант г-на aleh, то есть просто int(float_part+0.5), должно работать по идее.
ktulu вне форума  
Старый 05.06.2006, 15:46     # 8
Crazy_kettle
Junior Member
 
Регистрация: 13.05.2004
Сообщения: 128

Crazy_kettle Известность не заставит себя ждатьCrazy_kettle Известность не заставит себя ждать
В данном случае, Имхо лучше использовать ф-цию round (округляет до БЛИЖАЕШЕГО целого)
Crazy_kettle вне форума  
Старый 05.06.2006, 16:37     # 9
topknot
Junior Member
 
Регистрация: 25.09.2004
Адрес: ніжин
Сообщения: 128

topknot Известность не заставит себя ждатьtopknot Известность не заставит себя ждать
До сих пор в Си/Си++ не было функции round. Похоже Crazy_kettle перепутал с каким-то другим языком программирования.
topknot вне форума  
Старый 05.06.2006, 22:38     # 10
Crazy_kettle
Junior Member
 
Регистрация: 13.05.2004
Сообщения: 128

Crazy_kettle Известность не заставит себя ждатьCrazy_kettle Известность не заставит себя ждать
Цитата:
topknot:
До сих пор в Си/Си++ не было функции round. Похоже Crazy_kettle перепутал с каким-то другим языком программирования.
Что-то действительно я напутал. Меня сбила долбаная фраза в math.h:
Цитата:
/* 4.5.6 Nearest integer, absolute value, and remainder functions */
float __cdecl ceilf( float );
float __cdecl fabsf( float );
float __cdecl floorf( float );
float __cdecl fmodf( float , float );
Ну так как ceil округление свегху, floor снизу, а round до ближаёшего, его и вписал.

Последний раз редактировалось Crazy_kettle; 05.06.2006 в 22:42.
Crazy_kettle вне форума  
Старый 11.06.2006, 19:36     # 11
BorLase
::VIP::
 
Аватар для BorLase
 
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150

BorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех Гуру
Цитата:
Сообщение от topknot
До сих пор в Си/Си++ не было функции round.
...по причине ее полной ненужности
(int)(f_num+0.5) - вот тебе и округление к ближайшему целому
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people.
BorLase вне форума  
Старый 12.06.2006, 12:10     # 12
Gunslinger
Advanced Member
 
Аватар для Gunslinger
 
Регистрация: 15.09.2004
Адрес: Украина, Хмельницкий
Сообщения: 403

Gunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собойGunslinger Имеются все основания чтобы гордиться собой
Цитата:
BorLase:
...по причине ее полной ненужности
(int)(f_num+0.5) - вот тебе и округление к ближайшему целому
Ну как сказать, по моему Round(f_num) более читабельно чем твой вариант
__________________
The man in black fled across the desert, and the Gunslinger followed. (c) S.King
Gunslinger вне форума  
Старый 12.06.2006, 13:01     # 13
BorLase
::VIP::
 
Аватар для BorLase
 
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150

BorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех ГуруBorLase Отец (мать) всех Гуру
не спорю
я просто имел в виду, что она настолько элементарно пишется, что из-за этого ее и не стали вносить в библиотеку - типа кому надо, сам напишет
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people.
BorLase вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 15:51.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.