Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Проблемы с округлением вещественных чисел - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Слияние двух отсортированых массивов в один http://www.cyberforum.ru/cpp-beginners/thread911595.html
задание: Задано два массива. Массив А состоит из N элементов и отсортированный по увеличению . Массив В состоит из N элементов и отсортированный по уменьшению. Разработать программу для слияния этих...
C++ Не выполняется программа проводника Добрый день. Пишу программу проводник под DOS, начал с простого, вывод списка файлов из категории. В итоге программа не работает, в поисках багов оставил только одну функцию - вывод первого... http://www.cyberforum.ru/cpp-beginners/thread911586.html
Размер массива при передачи в функцию C++
День добрый, подскажите столкнулся с такой проблемой: void masssize (char mass) { int size = sizeof(mass)/sizeof(mass); cout << size; } int main () {
Потоковое Чтение и запись в файл C++
Всем привет. Подскажите пожалуйста с помощью каких функций и библиотек лучше всего производить запись и чтение из файла, + подскажите как сделать редактирование той же самой записи в файле. Заранее...
C++ Отловить сообщение о завершении потока(треда) http://www.cyberforum.ru/cpp-beginners/thread911559.html
Привет! Студия постоянно сигнализирует в окне вывода о завершении разных потоков в программе. Допустим я сам создаю один поток, который довольно сложен и в нем используется куча разных длл. Так вот...
C++ Найти ошибку Не могу найти ошибку в программе, не ищет букву "а", в некоторых случаях подсчет не правильный. Программа должна найти и подсчитать в строке кол-во букв "а" в первом слове. #include<conio.h>... подробнее

Показать сообщение отдельно
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552

Проблемы с округлением вещественных чисел - C++

26.06.2013, 06:36. Просмотров 1094. Ответов 1
Метки (Все метки)

В общем то сабж. Уже треть гугла перерыл, но вразумительного решения так и не нашёл.

Visual C++ (2005)

Нашёл по округлению 2 функции : floor и ceil.
Они обе не работают или работают не правильно.

Есть множество чисел типа Float, честно говоря если был бы вариант с типом 2 точек после запятой - я был бы рад, но такого нет, потому использую float. Нужно оставить только 2 числа после запятой, при этом округлив по правилам математики их.
Если я использую стандартную функцию floor, например:
C++
1
ebuf=floor((ebuf) * 100 + 0.5) / 100;
где естественно float ebuf. То результат вывода числа не изменяется, покопавшись в инете, нашёл кучу доводов об экпаненте и особенностях ОС(разрядах системы), где типа говорится что округляй ни округляй, а в итоге получиш число с (например) 5-ым знаком после запятой, меня это не устраивает.
Напрашиваются несколько вопросов:
1. Возможно есть какие то другие способы округления?
2. Возможно стоит писать функцию самому, которая будет брать вещественное число исходя из кол-ва его символов, и посимвольно удалять их, предварительно округляя?(кстати, как узнать кол-во символов вещественного числа?)
3. Ф-я round не поддерживается 2005\2009 студиями, стоит ли их переписать самому? - если они дадут правильный результат...
4. В итоге я эти float числа должен вывести по отдельности, суммировать и вывести в эксель общее, я понял что sprintf с "%.3f" дадут мне нужный вывод, однако оно не округляет число, и общий результат останется не округлённым, а исходя из кол-ва чисел, у меня их больше 500 - будет потеря в сотни\тысячи, что не очень хорошо...
5. Можно ли создать свой тип данных с 2 точками после запятой? =)
6. Возможно есть темы в которых уже данный вопрос решался, а я его пропустил из виду, и вы случайно имеете ссылку на обсуждение данного вопроса =)

За ранее, спасибо за помощь)

Добавлено через 11 часов 25 минут
Не уж то это действительно такой тяжёлый вопрос, что мне придётся писать собственную функцию разбора и округления через преобразование в char, а потом сравнение каждого эл-а до strlen(ebuf), а потом опять в флоат?... Ппц очень накладно получится =(

Добавлено через 3 часа 49 минут
Так, я решил протестировать ф-ю floor не в моём проэкте, а в обычном преложении...
Результат меня удивил:
C++
1
2
3
4
5
float x;
    cout << " Vvedite drobnoe 4iclo ";
    cin >> x;
    x = int(x*100 + 0.5)/100.0;
    cout << "\n New Float = " << x << endl;
На выходе я получаю 2 знака после запятой... Что меня вообще повергло в шок.
В моей программе даже этого не происходит.
C++
1
2
3
4
float ebuf=3.654745;
char vivod[i].cfeb[25]="";//это вообще то строка из структуры...
ebuf = int(ebuf*100 + 0.5)/100.0;
sprintf(vivod[i].cfeb,"%f",ebuf);//можно через "%.2f", но оно не округляет
После чего, переменная vivod[i].cfeb выводится в эксель... Только вот даже после присутствия ф-ии floor() результат не изменяется, как было 6 знаков после запятой, так и остаётся...

Добавлено через 5 минут
Такое ощущение, что выводится результат типа abs(), может оно так и есть?... Только вот что именно его делает таким? - функция sprintf или сам эксель?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru