Перейти к содержимому

Как найти дробную часть в си

  • автор:

Как получить дробную часть у числа с плавающей запятой?

что значит извлечь? вы хотите получить только дробную часть?

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

  • Android
  • +2 ещё

Почему FindLibrary выдает 0x0?

  • 1 подписчик
  • вчера
  • 63 просмотра

cpp

  • C++

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

  • 1 подписчик
  • вчера
  • 35 просмотров

cpp

  • C++

Почему не выводятся данные в консоль?

  • 1 подписчик
  • вчера
  • 47 просмотров

cpp

  • C++
  • +1 ещё

Как с помощью драйвера отследить появление нового файла в системе?

  • 1 подписчик
  • 25 окт.
  • 92 просмотра

cpp

  • C++

Как реализовать побитовый сдвиг чисел, которые записаны как строки ( длинные числа хранятся в строках)?

  • 1 подписчик
  • 25 окт.
  • 90 просмотров

cpp

  • C++

Как сделать ограничение максимума и минимума в генерации случайных чисел с помощью строк?

  • 1 подписчик
  • 24 окт.
  • 71 просмотр

cpp

  • C++

Почему в консоли отображаются неверные данные строки?

  • 1 подписчик
  • 24 окт.
  • 60 просмотров

windows

  • Windows
  • +1 ещё

Знает ли кто-то системную DLL, которая не фиксирует себя в памяти при загрузке?

  • 2 подписчика
  • 23 окт.
  • 242 просмотра

cpp

  • 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 DiLascia

    Re[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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *