Раздеоение на цифры - Очень срочно
От: TheAteist  
Дата: 15.11.08 12:28
Оценка: :)
То что я пытался сделать это разделить пятизначное число на цифры следующим образом.
Например число 12345:


float fNum = 12345;
int iNum;

iNum = fNum; //fNum = iNum = 12345 

//Первый цыкл
(fNum / 10 - iNum / 10) * 10 // => ((float)12345/10 - (int)12345/10) * 10 = 0.500000000000000000 * 10 = 5.000000000000000, сохраняю эту цифру
fNum = (fNum / 10) - ((fNum / 10 - iNum / 10)) // => (float)12345/10 - ((float)12345/10 - (int)12345/10) = 1234.50000000000000-(1234.50000000000000 - 1234)= 1234.50000000000000 - 0.500000000000000 = 1234.0000000000000=> fNum = 1234.0000000000000
iNum = fNum; // iNum = 1234
//Второй цыкл
(fNum / 10 - iNum / 10) * 10 // => ((float)1234/10 - (int)1234/10) * 10 = 0.40000000000000568 * 10 = 4.000000000000568, сохраняю эту цифру
fNum = (fNum / 10) - ((fNum / 10 - iNum / 10)) // => (float)1234/10 - ((float)1234/10 - (int)1234/10) = 123.40000000000001-(123.40000000000001 - 123)=123.40000000000001 - 0.4000000000000568=> fNum = 123.00000000000000
iNum = fNum; // iNum = 123
//Третий цыкл
(fNum / 10 - iNum / 10) * 10 // => ((float)123/10 - (int)123/10) * 10 = 0.3000000000000071 * 10 = 3.0000000000000718, сохраняю эту цифру
fNum = (fNum / 10) - ((fNum / 10 - iNum / 10)) // => (float)123/10 - ((float)123/10 - (int)123/10) = 12.30000000000001-(12.30000000000001 - 12)=12.30000000000001 - 0.300000000000071=> fNum = 12.00000000000000
iNum = fNum; // iNum = 12
//Четвертый цыкл
(fNum / 10 - iNum / 10) * 10 // => ((float)12/10 - (int)12/10) * 10 = 0.1999999999999996 * 10 = 1.999999999999996, сохраняю эту цифру

Как уже видно в четвертом цыкле уже получается не 2.00000000000000, а 1.99999999999999999 и тогда созраняается не 2, а 1.
И после всех цыклов получается
iDigits={1,1,3,4,5}, a не {1,2,3,4,5}

Надеюсь, что я себя правильно объяснил.
Мне нужно таким способом это сделать. Где мне что-то добавить или исправить?

Спасибо
Re: Раздеоение на цифры - Очень срочно
От: Аноним  
Дата: 15.11.08 13:28
Оценка:
Здравствуйте, TheAteist, Вы писали:

TA>То что я пытался сделать это разделить пятизначное число на цифры следующим образом.


Ну дык точность теряется при работе с плавающими типами, чему тут удивлятся

Есть 2 пути:
1. Это ввести epsilon=0.0001 и смотреть abs(x1 — x2) < epsilon
2. Юзать функцию floor по ходу
Re: Раздеоение на цифры - Очень срочно
От: Andregc  
Дата: 15.11.08 13:41
Оценка:
Здравствуйте, TheAteist, Вы писали:

TA>То что я пытался сделать это разделить пятизначное число на цифры следующим образом.

TA>Например число 12345:


TA>
TA>float fNum = 12345;
TA>int iNum;

TA>iNum = fNum; //fNum = iNum = 12345 

TA>//Первый цыкл
TA>(fNum / 10 - iNum / 10) * 10 // => ((float)12345/10 - (int)12345/10) * 10 = 0.500000000000000000 * 10 = 5.000000000000000, сохраняю эту цифру
TA>fNum = (fNum / 10) - ((fNum / 10 - iNum / 10)) // => (float)12345/10 - ((float)12345/10 - (int)12345/10) = 1234.50000000000000-(1234.50000000000000 - 1234)= 1234.50000000000000 - 0.500000000000000 = 1234.0000000000000=> fNum = 1234.0000000000000
TA>iNum = fNum; // iNum = 1234
TA>//Второй цыкл
TA>(fNum / 10 - iNum / 10) * 10 // => ((float)1234/10 - (int)1234/10) * 10 = 0.40000000000000568 * 10 = 4.000000000000568, сохраняю эту цифру
TA>fNum = (fNum / 10) - ((fNum / 10 - iNum / 10)) // => (float)1234/10 - ((float)1234/10 - (int)1234/10) = 123.40000000000001-(123.40000000000001 - 123)=123.40000000000001 - 0.4000000000000568=> fNum = 123.00000000000000
TA>iNum = fNum; // iNum = 123
TA>//Третий цыкл
TA>(fNum / 10 - iNum / 10) * 10 // => ((float)123/10 - (int)123/10) * 10 = 0.3000000000000071 * 10 = 3.0000000000000718, сохраняю эту цифру
TA>fNum = (fNum / 10) - ((fNum / 10 - iNum / 10)) // => (float)123/10 - ((float)123/10 - (int)123/10) = 12.30000000000001-(12.30000000000001 - 12)=12.30000000000001 - 0.300000000000071=> fNum = 12.00000000000000
TA>iNum = fNum; // iNum = 12
TA>//Четвертый цыкл
TA>(fNum / 10 - iNum / 10) * 10 // => ((float)12/10 - (int)12/10) * 10 = 0.1999999999999996 * 10 = 1.999999999999996, сохраняю эту цифру
TA>

TA>Как уже видно в четвертом цыкле уже получается не 2.00000000000000, а 1.99999999999999999 и тогда созраняается не 2, а 1.
TA>И после всех цыклов получается
TA>iDigits={1,1,3,4,5}, a не {1,2,3,4,5}

TA>Надеюсь, что я себя правильно объяснил.

TA>Мне нужно таким способом это сделать. Где мне что-то добавить или исправить?

TA>Спасибо
Re[2]: Раздеоение на цифры - Очень срочно
От: Andregc  
Дата: 15.11.08 13:47
Оценка:
Здравствуйте, Andregc, Вы писали:

A>Здравствуйте, TheAteist, Вы писали:


TA>>То что я пытался сделать это разделить пятизначное число на цифры следующим образом.

TA>>Например число 12345:


TA>>
TA>>float fNum = 12345;
TA>>int iNum;

TA>>iNum = fNum; //fNum = iNum = 12345 

TA>>//Первый цыкл
TA>>(fNum / 10 - iNum / 10) * 10 // => ((float)12345/10 - (int)12345/10) * 10 = 0.500000000000000000 * 10 = 5.000000000000000, сохраняю эту цифру
TA>>fNum = (fNum / 10) - ((fNum / 10 - iNum / 10)) // => (float)12345/10 - ((float)12345/10 - (int)12345/10) = 1234.50000000000000-(1234.50000000000000 - 1234)= 1234.50000000000000 - 0.500000000000000 = 1234.0000000000000=> fNum = 1234.0000000000000
TA>>iNum = fNum; // iNum = 1234
TA>>//Второй цыкл
TA>>(fNum / 10 - iNum / 10) * 10 // => ((float)1234/10 - (int)1234/10) * 10 = 0.40000000000000568 * 10 = 4.000000000000568, сохраняю эту цифру
TA>>fNum = (fNum / 10) - ((fNum / 10 - iNum / 10)) // => (float)1234/10 - ((float)1234/10 - (int)1234/10) = 123.40000000000001-(123.40000000000001 - 123)=123.40000000000001 - 0.4000000000000568=> fNum = 123.00000000000000
TA>>iNum = fNum; // iNum = 123
TA>>//Третий цыкл
TA>>(fNum / 10 - iNum / 10) * 10 // => ((float)123/10 - (int)123/10) * 10 = 0.3000000000000071 * 10 = 3.0000000000000718, сохраняю эту цифру
TA>>fNum = (fNum / 10) - ((fNum / 10 - iNum / 10)) // => (float)123/10 - ((float)123/10 - (int)123/10) = 12.30000000000001-(12.30000000000001 - 12)=12.30000000000001 - 0.300000000000071=> fNum = 12.00000000000000
TA>>iNum = fNum; // iNum = 12
TA>>//Четвертый цыкл
TA>>(fNum / 10 - iNum / 10) * 10 // => ((float)12/10 - (int)12/10) * 10 = 0.1999999999999996 * 10 = 1.999999999999996, сохраняю эту цифру
TA>>

TA>>Как уже видно в четвертом цыкле уже получается не 2.00000000000000, а 1.99999999999999999 и тогда созраняается не 2, а 1.
TA>>И после всех цыклов получается
TA>>iDigits={1,1,3,4,5}, a не {1,2,3,4,5}

TA>>Надеюсь, что я себя правильно объяснил.

TA>>Мне нужно таким способом это сделать. Где мне что-то добавить или исправить?

TA>>Спасибо


Сорри, чето напутал
Если тебе нужны только целые числа то все гораздо проще

iNum=12345
while(inum != 0) {
digit = iNum % 10;
inum /= 10;
}
Re: Раздеоение на цифры - Очень срочно
От: Аноним  
Дата: 15.11.08 13:50
Оценка:
Здравствуйте, TheAteist, Вы писали:

TA>То что я пытался сделать это разделить пятизначное число на цифры следующим образом.

TA>Например число 12345:
Я не пойму чего ты к типу float прицепился? От этого у тебя все проблемы. Используй unsigned int.
Re: Раздеоение на цифры - Очень срочно
От: MasterZiv СССР  
Дата: 16.11.08 20:23
Оценка:
TheAteist пишет:

> То что я пытался сделать это разделить пятизначное число на цифры

> следующим образом.
> Например число 12345:

Видимо, вы не понимаете, что во float нет десятичных цифр.
то, что вы пытаетесь сделать, сделать невозможно (с типами данных float/double).
надо использовать точные десятичные данные.
Posted via RSDN NNTP Server 2.1 beta
Re: Раздеоение на цифры - Очень срочно
От: Bell Россия  
Дата: 17.11.08 03:20
Оценка:
Здравствуйте, TheAteist, Вы писали:

What Every Computer Scientist Should Know About Floating-Point Arithmetic
Любите книгу — источник знаний (с) М.Горький
Re: Раздеоение на цифры - Очень срочно
От: Кодт Россия  
Дата: 17.11.08 18:43
Оценка:
Здравствуйте, TheAteist, Вы писали:

Если очень срочно, то sprintf / fcvt / ostringstream.
Если срочно и вдумчиво, то посмотреть на исходник fcvt. (А также ecvt и gcvt).
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re: Раздеоение на цифры - Очень срочно
От: alzt  
Дата: 18.11.08 12:50
Оценка:
Здравствуйте, TheAteist, Вы писали:

TA>То что я пытался сделать это разделить пятизначное число на цифры следующим образом.

TA>Например число 12345:

TA>
TA>float fNum = 12345;
TA>int iNum;

TA>iNum = fNum; //fNum = iNum = 12345 

TA>//Первый цыкл
TA>(fNum / 10 - iNum / 10) * 10 // => ...
TA>


TA>Надеюсь, что я себя правильно объяснил.

TA>Мне нужно таким способом это сделать. Где мне что-то добавить или исправить?

Зачем здесь float?

Думаю, тебе надо было это
int iNum = 12345;
int iDigit5 = (iNum % 10) / 1;
int iDigit4 = (iNum % 100) / 10;
int iDigit3 = (iNum % 1000) / 100;
int iDigit2 = (iNum % 10000) / 1000;
int iDigit1 = (iNum % 100000) / 10000;


Цикл написать будет не сложно.
Если % не подходит, тогда переделывай свой вариант, только без float. Здесь всё-таки целочисленная арифметика.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.