Как получить дробную часть у числа с плавающей запятой?
что значит извлечь? вы хотите получить только дробную часть?
20 янв 2017 в 14:20
да, только дробную
20 янв 2017 в 14:20
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Используйте функцию modf . Стоит учитывать, что знак дробной части будет такой же как знак исходного числа. Для отрицательных чисел, дробная часть будет отрицательной.
float money; double fractpart, intpart; money = 8.12; fractpart = modf(money, &intpart); printf("Integral part = %lf\n", intpart); printf("Fraction Part = %lf \n", fractpart);
Отслеживать
ответ дан 20 янв 2017 в 14:24
Mikhail Vaysman Mikhail Vaysman
14.2k 1 1 золотой знак 21 21 серебряный знак 31 31 бронзовый знак
для отрицательных может работать немного неожиданно. Да и money — (int)money как-то привычнее.
20 янв 2017 в 14:27
что вы имеете в виду под неожиданно?
20 янв 2017 в 14:29
отрицательная дробная часть например. Как бы многие знакомые с математикой предполагают, что дробная часть строго меньше 1 и больше или равна 0.
Modf – разделяет число на целую и дробную части

Функция modf() позволяет разделить число типа double на целую и дробную части. Целая часть помещается в iptr, а дробная возвращается. Метод modf имеет реализацию, которая использует Streaming SIMD Extensions 2 (SSE2). C++ допускает вызов перегрузки modf, которая принимает и возвращает параметры типа float или long double. В приложении на языке программирования C функция modf всегда принимает на вход два двойных значения, а возвращает двойное значение.
Синтаксис
#include float modff(float x, float *iptr); double modf(double x, double *iptr); long double modfl(long double x, long double *iptr); //x – число, которое требуется разделить на две части: целую дробную //iptr – указатель на переменную, содержащую целую часть числа x
Прототип
| Название | Язык |
|---|---|
| math.h | С |
| cmath | С++ |
Возвращаемое значение
Метод modf() возвращает целую и дробную части в виде двух элементов, возвращаемое значение которых имеют один и тот же знак. Целая часть x возвращается в виде вещественного числа.
Обработка ошибок
- Если x равно ±0, возвращается ±0, а ±0 сохраняется в *iptr.
- Если x равно ±∞, возвращается ±0, а ±∞ сохраняется в *iptr.
- Если x равно NaN, возвращается NaN, а NaN сохраняется в *iptr.
Возвращаемое значение x является точным, а округление игнорируется.
Переносимость
Функция modf уникальна для DOS.
Пример
#include double func, integer; double number = StrToFloat(Edit1->Text); func = modf(number,&integer); Edit2->Text = integer; Edit3->Text = func;
Как получить дробную часть числа?

- Android
- +2 ещё
Почему FindLibrary выдает 0x0?
- 1 подписчик
- вчера
- 63 просмотра

- C++
Как вычислить порядок погрешности в этом коде по формуле?
- 1 подписчик
- вчера
- 35 просмотров

- C++
Почему не выводятся данные в консоль?
- 1 подписчик
- вчера
- 47 просмотров

- C++
- +1 ещё
Как с помощью драйвера отследить появление нового файла в системе?
- 1 подписчик
- 25 окт.
- 92 просмотра

- C++
Как реализовать побитовый сдвиг чисел, которые записаны как строки ( длинные числа хранятся в строках)?
- 1 подписчик
- 25 окт.
- 90 просмотров

- C++
Как сделать ограничение максимума и минимума в генерации случайных чисел с помощью строк?
- 1 подписчик
- 24 окт.
- 71 просмотр

- C++
Почему в консоли отображаются неверные данные строки?
- 1 подписчик
- 24 окт.
- 60 просмотров

- Windows
- +1 ещё
Знает ли кто-то системную DLL, которая не фиксирует себя в памяти при загрузке?
- 2 подписчика
- 23 окт.
- 242 просмотра

- C++
Как хранятся многомерные массивы в памяти?
- 1 подписчик
- 23 окт.
- 119 просмотров

- Программирование
- +2 ещё
Как написать проект обмена данными с помощью native API для 1с на c++?
- 1 подписчик
- 23 окт.
- 65 просмотров
До 300 000 ₽
от 350 000 ₽
от 110 000 ₽
29 окт. 2023, в 14:59
20000 руб./за проект
29 окт. 2023, в 14:49
2000 руб./за проект
29 окт. 2023, в 13:41
10000 руб./за проект
Минуточку внимания
Присоединяйтесь к сообществу, чтобы узнавать новое и делиться знаниями
- Как лучше оформить такую галерею?
- 2 подписчика
- 1 ответ
- 2 подписчика
- 0 ответов
- 4 подписчика
- 1 ответ
- 4 подписчика
- 2 ответа
- 2 подписчика
- 1 ответ
- 2 подписчика
- 0 ответов
- 2 подписчика
- 1 ответ
- 2 подписчика
- 0 ответов
- 2 подписчика
- 1 ответ
- 2 подписчика
- 1 ответ
Как найти дробную часть в си
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее.
Re: Выделение дробной части из вещественного числа
От: Кодт Дата: 26.12.03 11:39 Оценка: Здравствуйте, Faust, Вы писали:
F>Пытаюсь выделить дробную часть из числа с плавающей точкой.
А написать формулу
double fint(double x) // округление в сторону нуля (т.е. меньшее по абсолютному значению) < return x>=0. ? floor(x) : ceil(x) > double frac(double x) // знак результата совпадает со знаком числа < return x - fint(x); > // инварианты: assert( x == fint(x) + frac(x) ); assert( fabs(x)-1. < fabs(fint(x)) && fabs(fint(x))К тому же, можно эти штуки сделать шаблонными, так что они будут работать и с float, и с long double. И даже с каким-нибудь YourCoolFixedPointNum. Главное — чтобы были определены функции floor и ceil, и сравнение с 0.
Перекуём баги на фичи!
Re[2]: Выделение дробной части из вещественного числаОт: Faust Дата: 26.12.03 11:50 Оценка: Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Faust, Вы писали:
F>>Пытаюсь выделить дробную часть из числа с плавающей точкой.
К>А написать формулу
К>К>double fint(double x) // округление в сторону нуля (т.е. меньшее по абсолютному значению) К> < К>return x>=0. К> ? floor(x) К> : ceil(x) К>> К>double frac(double x) // знак результата совпадает со знаком числа К> < К>return x - fint(x); К>> К>// инварианты: К>assert( x == fint(x) + frac(x) ); К>assert( fabs(x)-1. < fabs(fint(x)) && fabs(fint(x)) assert( 0.
К>не катит?
К>К тому же, можно эти штуки сделать шаблонными, так что они будут работать и с float, и с long double. И даже с каким-нибудь YourCoolFixedPointNum. Главное — чтобы были определены функции floor и ceil, и сравнение с 0.
Просто хочеться разобраться с бинарным представлением чисел с плавающей точкой. И уже после этого заточить под шаблон.
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее.
Re[2]: Выделение дробной части из вещественного числа
От: Denwer Дата: 26.12.03 11:55 Оценка: Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Faust, Вы писали:
Ну мне кажется что надо было получить челу немного другой результат, т.е. не дробную часть в виде float числа, а именно приведенную к wekjve числу, т.е.
float a = 1.123; int с = func(a); //с = 123Что то вроде этого.
ЗЫ: А получить дробную то это совсем пустяк.
Re[3]: Выделение дробной части из вещественного числа
От: Faust Дата: 26.12.03 12:00 Оценка: Здравствуйте, Denwer, Вы писали:
D>Ну мне кажется что надо было получить челу немного другой результат, т.е. не дробную часть в виде float числа, а именно приведенную к wekjve числу, т.е.
D>D>float a = 1.123; D>int с = func(a); //с = 123 D>D>Что то вроде этого.
D>ЗЫ: А получить дробную то это совсем пустяк.
Может у тебя есть формула, которая соответсвует данному стандарту(IEEE(LitleEndian)), и позволяет решить эту задачу? Мне найти ее не удалось, да и собственные потуги не увенчались успехом.
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее.
Re[3]: Выделение дробной части из вещественного числа
От: Кодт Дата: 26.12.03 12:01 Оценка: 12 (1) Здравствуйте, Faust, Вы писали:
F>Просто хочеться разобраться с бинарным представлением чисел с плавающей точкой. И уже после этого заточить под шаблон.
А. Тогда, в принципе, все просто.
union FPMapping < float value; struct < bool sign:1; unsigned exponent:8; unsigned mantissa:23; > // ну или как оно там. bits; >; void make_frac(FPMapping& fp) < unsigned zero_exp = 128; if(fp.bits.exponent < zero_exp) // число уже меньше 1 return; // отбросим разряды, относящиеся к целой части fp.bits.mantissa // нормализуем while((fp.bits.mantissa & (1 <<22)) == 0) < fp.bits.mantissa // теперь старший разряд равен 1. его тоже нужно отбросить. fp.bits.mantissa ;Вот, насколько я понимаю механику.
(Могу заблуждаться. )
Перекуём баги на фичи!
Re[4]: Выделение дробной части из вещественного числаОт: Faust Дата: 26.12.03 12:24 Оценка: Здравствуйте, Кодт, Вы писали:
К>А. Тогда, в принципе, все просто.
К>К>union FPMapping К> < К>float value; К> struct К> < bool sign:1; unsigned exponent:8; unsigned mantissa:23; > // ну или как оно там. К> bits; К>>; К>void make_frac(FPMapping& fp) К> < К>unsigned zero_exp = 128; К> if(fp.bits.exponent < zero_exp) // число уже меньше 1 К> return; К> // отбросим разряды, относящиеся к целой части К> fp.bits.mantissa fp.bits.exponent = zero_exp; К> // нормализуем К> while((fp.bits.mantissa & (1 <<22)) == 0) К> < К>fp.bits.mantissa fp.bits.exponent--; К> > К> // теперь старший разряд равен 1. его тоже нужно отбросить. К> fp.bits.mantissa fp.bits.exponent--; К>>; К>К>Вот, насколько я понимаю механику.
К>(Могу заблуждаться. )Нет, ты не понял. Мне не нужно просто отбросить целую часть у числа. Нужно получить дробную часть числа в переменной типа unsigned long, не изменяя при этом само число.
Да, кстати не 128, а 127 нужно вычитать.Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее.
Re[5]: Выделение дробной части из вещественного числа
От: Кодт Дата: 26.12.03 12:57 Оценка: Здравствуйте, Faust, Вы писали:
F>Нет, ты не понял. Мне не нужно просто отбросить целую часть у числа. Нужно получить дробную часть числа в переменной типа unsigned long, не изменяя при этом само число.
У какого-какого числа?
Очень даже понял. Вот смотри:
float my_frac(float v) < FPMapping victim; // жертва изнасилования victim.value = v; make_frac(victim); // насилуем return victim.value; > // это к вопросу об unsigned long. inline unsigned long f2l(float v) < return *reinterpret_castunsigned long*>(&v); > inline float l2f(unsigned long v) < return *reinterpret_castfloat*>(&v); >F>Да, кстати не 128, а 127 нужно вычитать.
Перекуём баги на фичи!
Re[6]: Выделение дробной части из вещественного числаОт: Faust Дата: 26.12.03 13:09 Оценка: Здравствуйте, Кодт, Вы писали:
К>// это к вопросу об unsigned long.
К>inline unsigned long f2l(float v) < return *reinterpret_cast(&v); >
К>inline float l2f(unsigned long v) < return *reinterpret_cast(&v); >
К>[/c]Ты результат этих преобразований видел?
Если нет, то очень советую посмотреть.Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее.
Re[6]: Выделение дробной части из вещественного числа
От: Аноним Дата: 26.12.03 13:09 Оценка: Здравствуйте, Кодт, Вы писали:
F>>Нет, ты не понял. Мне не нужно просто отбросить целую часть у числа. Нужно получить дробную часть числа в переменной типа unsigned long, не изменяя при этом само число.
К>У какого-какого числа?
К>Очень даже понял.
А вот я ничего не понял. Что такое "дробная часть числа" понять могу, а вот как ее представить типом unsigned long — не могу. Если Вы поняли, может, объясните?
Re[7]: Выделение дробной части из вещественного числа
От: Faust Дата: 26.12.03 13:18 Оценка: Здравствуйте, Аноним, Вы писали:
А>А вот я ничего не понял. Что такое "дробная часть числа" понять могу, а вот как ее представить типом unsigned long — не могу. Если Вы поняли, может, объясните?
float fNumber = 123.54321; unsigned long dwWhole = 123; unsigned long dwFrac = 54321;Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее.
Re[7]: Выделение дробной части из вещественного числа
От: Кодт Дата: 26.12.03 13:28 Оценка: Здравствуйте, Faust, Вы писали:
К>>// это к вопросу об unsigned long. К>>inline unsigned long f2l(float v) < return *reinterpret_castunsigned long*>(&v); > К>>inline float l2f(unsigned long v) < return *reinterpret_castfloat*>(&v); > К>>F>Ты результат этих преобразований видел?
F>Если нет, то очень советую посмотреть.Видел. это побитовое представление 4байтного числа с плавающей точкой.
Точно так же, как *reinterpret_cast((const char*)"\xDE\xAD\xBE\xEF") == 0xDEADBEEF либо 0xFEBEADDE, в зависимости от little|big endian.Перекуём баги на фичи!
Re[8]: Выделение дробной части из вещественного числаОт: Аноним Дата: 26.12.03 13:28 Оценка: Здравствуйте, Faust, Вы писали:
А>>А вот я ничего не понял. Что такое "дробная часть числа" понять могу, а вот как ее представить типом unsigned long — не могу. Если Вы поняли, может, объясните?
F>float fNumber = 123.54321; F>unsigned long dwWhole = 123; F>unsigned long dwFrac = 54321;Вы знаете заранее, до какого знака после запятой Вам нужно получить дробную часть?
Или просто не понимаете представления чисел с плавающей точкой?Re[8]: Выделение дробной части из вещественного числа
От: Кодт Дата: 26.12.03 13:29 Оценка: Здравствуйте, Faust, Вы писали:
А>>А вот я ничего не понял. Что такое "дробная часть числа" понять могу, а вот как ее представить типом unsigned long — не могу. Если Вы поняли, может, объясните?
F>F>float fNumber = 123.54321; F>unsigned long dwWhole = 123; F>unsigned long dwFrac = 54321; F>Ах, ты этого хочешь. А скажи ка, любезнейший, какой будет dwFrac для числа 123.0000054321 ?
Перекуём баги на фичи!
Re: Выделение дробной части из вещественного числаОт: SchweinDeBurg http://zarezky.spb.ru/ Дата: 26.12.03 13:31 Оценка: Здравствуйте, Faust, Вы писали:
F>[/ccode]Как мне получить дробную часть?
А чем плоха modf() ?
Splits a floating-point value into fractional and integer parts.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLasciaRe[8]: Выделение дробной части из вещественного числа
От: Faust Дата: 26.12.03 13:35 Оценка: Здравствуйте, Кодт, Вы писали:
К>Видел. это побитовое представление 4байтного числа с плавающей точкой.
К>Точно так же, как *reinterpret_cast((const char*)"\xDE\xAD\xBE\xEF") == 0xDEADBEEF либо 0xFEBEADDE, в зависимости от little|big endian.float fNumber = 0.54321; unsigned long dwFrac = f2l(fNumber); // 3435973836а если сделаем так:
dwFrac >= 8;то получим мантиссу этого числа, а именно 724944
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее.
Re[9]: Выделение дробной части из вещественного числа
От: Faust Дата: 26.12.03 13:39 Оценка: Здравствуйте, Кодт, Вы писали:
К>Ах, ты этого хочешь. А скажи ка, любезнейший, какой будет dwFrac для числа 123.0000054321 ?
К>если число представлено типом float, то dwFrac будет равен 0
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее.
Re[9]: Выделение дробной части из вещественного числа
От: Faust Дата: 26.12.03 13:40 Оценка: Здравствуйте, Аноним, Вы писали:
А>Вы знаете заранее, до какого знака после запятой Вам нужно получить дробную часть?
для float до 5-го знака
А>Или просто не понимаете представления чисел с плавающей точкой?
нет не понимаюМой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее.
Re[10]: Выделение дробной части из вещественного числа
От: Кодт Дата: 26.12.03 14:00 Оценка: Здравствуйте, Faust, Вы писали:
F>Здравствуйте, Кодт, Вы писали:
К>>Ах, ты этого хочешь. А скажи ка, любезнейший, какой будет dwFrac для числа 123.0000054321 ?
К>>F>если число представлено типом float, то dwFrac будет равен 0
Ну хорошо, 1.00321.
Чем отличается от 1.321.
И чем отличается от 1.32100.Или тебе нужно получить представление x = y + z, где y — целое, z = 0.00001 * t, t целое в диапазоне 0..99999 ?
Выбери что-то одно: или трахаться с двоичным представлением вещественных чисел, или писать формулы.
Формула будет простая:struct FixedPoint < bool negative; unsigned int whole, fract; // неотрицательные FixedPoint(double f) < negative = f < 0.0; if(negative) f = -f; // далее - работаем с неотрицательными whole = (unsigned int)floor(f); fract = (unsigned int)((f - floor(f)) * 10000); > operator double() const < return (0.00001 * fract + whole) * (negative ? -1 : 1); > >;Перекуём баги на фичи!
Re[9]: Выделение дробной части из вещественного числаОт: Кодт Дата: 26.12.03 14:09 Оценка: Здравствуйте, Faust, Вы писали:
Числа с плавающей точкой представлены в виде S * M * 2^E.
Обрати внимание: экспонируется степень 2, а не 10.
Поэтому нахаляву получить десятичную запись дробной части (да и числа целиком) не получится.int take_5_digits(float x) < return int((x-floor(x))*100000); > // x >= 0