IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Проблема при конвертация float->int !!! (https://www.imho.ws/showthread.php?t=35565)

naumenko 01.08.2003 08:47

Проблема при конвертация 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 ???!!!
Помогите пожалуйста!


Заранее благодарен.

aleh 01.08.2003 10:17

Это нормально. Есть две причины:
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 :)

Tano 26.05.2006 14:21

Скажите, как при считывании инфы из файла в char'овский массим потом переконвертить его в int или double?
Спасибо

Kvarx 26.05.2006 16:09

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

1) из нескольких элементов массива составить число?
2) или каждый элемент массива перегнать в число?

GOre01 26.05.2006 16:38

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();
...

это только пример. надо делать проверку на символы в считанном буфере, проверять на то, какое это число (целое или дробное) и т.п.

функций, переводящих строку в число бульше, чем я написал, остальное можно посмотреть в справке.

Tano 27.05.2006 23:28

Kvarx, элемент записываются в массив, например 1.1 и сразу переводится в double..в принципе GOre01 понятно объяснил - спасибо, я попробую уже сам.

ktulu 28.05.2006 01:40

Насколько я помню, округление при преобразовании float->int всегда в меньшую сторону. Если не жалко времени (не своего, а затрачиваемого на выполнение проги), то или юзай floor()/ceil(), или используй вариант г-на aleh, то есть просто int(float_part+0.5), должно работать по идее. :idontnow:

Crazy_kettle 05.06.2006 15:46

В данном случае, Имхо лучше использовать ф-цию round (округляет до БЛИЖАЕШЕГО целого)

topknot 05.06.2006 16:37

До сих пор в Си/Си++ не было функции round. Похоже Crazy_kettle перепутал с каким-то другим языком программирования.

Crazy_kettle 05.06.2006 22:38

Цитата:

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 до ближаёшего, его и вписал. :молись:

BorLase 11.06.2006 19:36

Цитата:

Сообщение от topknot
До сих пор в Си/Си++ не было функции round.

...по причине ее полной ненужности :)
(int)(f_num+0.5) - вот тебе и округление к ближайшему целому :)

Gunslinger 12.06.2006 12:10

Цитата:

BorLase:
...по причине ее полной ненужности
(int)(f_num+0.5) - вот тебе и округление к ближайшему целому
Ну как сказать, по моему Round(f_num) более читабельно чем твой вариант

BorLase 12.06.2006 13:01

не спорю :)
я просто имел в виду, что она настолько элементарно пишется, что из-за этого ее и не стали вносить в библиотеку - типа кому надо, сам напишет


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

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