Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
svarga
1 / 1 / 1
Регистрация: 14.02.2013
Сообщений: 60
1

Float меняет значение visual c++

21.10.2014, 13:10. Просмотров 1252. Ответов 18
Метки нет (Все метки)

Всем привет! Вообщем есть такой код
C++
1
2
3
4
5
6
7
8
    float x, y;
    printf ("Введи X (-3.14) x = ");
    //cin >> x;
    scanf ("%f", &x);
    printf ("Введи Y (6.28)  y = ");
    scanf ("%f", &y);
 
    if (x > 20.34)
и тут происходит самое интересное при вводе для x любого значения (например 3,14), при остановке в отладчике на строке [ if (x > 20.34) ] x = 3,14000010 не могу понять от куда берётся эта единица в предпоследнем разряде? И не только scanf но и cin тоже так работает. Вообщем очень жду помощи. Заранее благодарю.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2014, 13:10
Ответы с готовыми решениями:

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
#include<stdio.h> #include<stdlib.h> #include<math.h> float f1(float x)/*vira*enie 1*/ ...

"Значение типа float* нельзя использовать для инициализации сущности типа float"
#include <math.h> #include<iostream> #include <iomanip> #include<conio.h> using namespace std;...

setcolor не меняет значение
Очень странная вещь, покрайней мере для меня, может для вас ответ будет очевидным Я передаю...

Ошибка преобразования: значение типа "float *" нельзя присвоить сущности типа "float"
Помогите исправить.Значение типа "float *" нельзя присвоить сущности типа float void Mode2() {...

Функция не меняет значение аргументов (за ее пределами)
Код: //заголовочный #ifndef HTPOTC_H #define HTPOTC_H class Rational{ public:...

18
DrOffset
11093 / 5948 / 1459
Регистрация: 30.01.2014
Сообщений: 9,575
21.10.2014, 13:15 2
Цитата Сообщение от svarga Посмотреть сообщение
И не только scanf но и cin тоже так работает.
scanf тут не при чем. Это особенность представления чисел с плавающей точкой. Некоторые числа нельзя точно представить в машине, поэтому появляется ошибка точности представления. В общем, вот, читай.
0
Evg
Эксперт CАвтор FAQ
20926 / 8063 / 623
Регистрация: 30.03.2009
Сообщений: 22,380
Записей в блоге: 30
21.10.2014, 14:01 3
Пояснение вкратце: double + cout
Пояснение на пальцах: http://www.cyberforum.ru/blogs/18334/blog88.html
0
svarga
1 / 1 / 1
Регистрация: 14.02.2013
Сообщений: 60
21.10.2014, 15:54  [ТС] 4
вроде бы и разобрался с тем моментом как они хранятся в машине, НО как этого избежать? неужели для каждой такой переменной нужно использовать функцию округления или можно всё таки как то отбросить изначально количество нулей после запятой?
0
21.10.2014, 15:54
Evg
Эксперт CАвтор FAQ
20926 / 8063 / 623
Регистрация: 30.03.2009
Сообщений: 22,380
Записей в блоге: 30
21.10.2014, 16:09 5
Цитата Сообщение от svarga Посмотреть сообщение
НО как этого избежать?
Чего конкретно избежать?
0
svarga
1 / 1 / 1
Регистрация: 14.02.2013
Сообщений: 60
21.10.2014, 16:23  [ТС] 6
я имел ввиду что в коде мне поправить что бы значение переменной X было ровно таким каким я его ввожу
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5803 / 2796 / 766
Регистрация: 18.10.2014
Сообщений: 5,065
21.10.2014, 16:37 7
Цитата Сообщение от svarga Посмотреть сообщение
я имел ввиду что в коде мне поправить что бы значение переменной X было ровно таким каким я его ввожу
Значение переменной, хранимой в стандартном двоичном плавающем формате, в общем случае вообще не может быть "таким, каким я его ввожу". Число "0.1", например, в принципе невозможно представить точно в таких форматах. Ваше "3.14" тоже невозможно представить точно. Поэтому, как ни верти, пока вы используете float или double, придется мириться с тем, что представление будет приближенным.

Если вам нужно именно точное представление, то формат этого представления вам придется изобретать и поддерживать самому. Т.е. забудьте о float и double.
0
svarga
1 / 1 / 1
Регистрация: 14.02.2013
Сообщений: 60
21.10.2014, 16:44  [ТС] 8
то есть я не могу сравнить число ПИ например с 20.34 или число 20.34 с таким же введённым числом так как оно будет (20.340000010), в таком случае может можно как-нибудь обрезать это число при вводе с клавиатуры? Приведите элементарный пример как обойти эту ситуация буду очень благодарен
0
Evg
Эксперт CАвтор FAQ
20926 / 8063 / 623
Регистрация: 30.03.2009
Сообщений: 22,380
Записей в блоге: 30
21.10.2014, 17:29 9
Цитата Сообщение от svarga Посмотреть сообщение
то есть я не могу сравнить число ПИ например с 20.34 или число 20.34 с таким же введённым числом так как оно будет (20.340000010), в таком случае может можно как-нибудь обрезать это число при вводе с клавиатуры? Приведите элементарный пример как обойти эту ситуация буду очень благодарен
Распространенные ошибки
1
nmcf
6535 / 5758 / 2622
Регистрация: 14.04.2014
Сообщений: 24,498
21.10.2014, 17:53 10
Оно преобразуется перед сравнением в вещественный формат и обретёт ту же погрешность.
0
svarga
1 / 1 / 1
Регистрация: 14.02.2013
Сообщений: 60
21.10.2014, 18:19  [ТС] 11
с fabs я разобрался, спасибо за подсказку. Но остаётся ещё вот какой вопрос: как от типа float отрезать лишении разряды, тоесть записать их нулями ну или что то ещё (не округлять а именно избавиться от них совсем)

Добавлено через 1 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
Оно преобразуется перед сравнением в вещественный формат и обретёт ту же погрешность.
Оно это кто? число 20,34?
0
nmcf
6535 / 5758 / 2622
Регистрация: 14.04.2014
Сообщений: 24,498
21.10.2014, 18:23 12
Да, число.
0
svarga
1 / 1 / 1
Регистрация: 14.02.2013
Сообщений: 60
21.10.2014, 18:31  [ТС] 13
но ведь этого не происходит и введённое 20.34 больше чем 20.34 же в условии
C++
1
2
3
4
5
6
float x, y;
    printf ("Введи X (-3.14) x = ");
    scanf ("%f",&x);
 
    if (x > 20.34)
        printf("X не может быть больше 20.34\n");
тоесть условие не срабатывает и появляется сообщение что Х не может быть больше....
0
Evg
Эксперт CАвтор FAQ
20926 / 8063 / 623
Регистрация: 30.03.2009
Сообщений: 22,380
Записей в блоге: 30
21.10.2014, 18:33 14
Цитата Сообщение от svarga Посмотреть сообщение
с fabs я разобрался, спасибо за подсказку. Но остаётся ещё вот какой вопрос: как от типа float отрезать лишении разряды, тоесть записать их нулями ну или что то ещё (не округлять а именно избавиться от них совсем)
Отрезать никак, тебе уже сказали. Потому что в памяти машины НЕТУ числа 20.34, там есть только число 20.340000010, если, условно говоря, значения числа уменьшить на один бит, то получится число 20.339999999787 (типа того). Т.а. машина В ПРИНЦИПЕ не может в памяти хранить число, десятичная запись которого выглядела бы как 20.34

Если вопрос в том, как напечатать, то используй возможности печати нужного количества знаков после запятой. http://www.cyberforum.ru/blogs/18334/blog507.html далее раздел 3.4
0
svarga
1 / 1 / 1
Регистрация: 14.02.2013
Сообщений: 60
21.10.2014, 18:36  [ТС] 15
Цитата Сообщение от Evg Посмотреть сообщение
Отрезать никак, тебе уже сказали. Потому что в памяти машины НЕТУ числа 20.34, там есть только число 20.340000010, если, условно говоря, значения числа уменьшить на один бит, то получится число 20.339999999787 (типа того). Т.а. машина В ПРИНЦИПЕ не может в памяти хранить число, десятичная запись которого выглядела бы как 20.34
Если вопрос в том, как напечатать, то используй возможности печати нужного количества знаков после запятой. http://www.cyberforum.ru/blogs/18334/blog507.html далее раздел 3.4
нет с печатью мне всё ясно дело в другом мне нужно что бы когда я ввожу с клавиатуры 20,34 условие срабатывало таким образом что бы мне не говорили что 20,34 > 20.34 вот и всё чего я так хочу. Как это реализовать?
0
Evg
Эксперт CАвтор FAQ
20926 / 8063 / 623
Регистрация: 30.03.2009
Сообщений: 22,380
Записей в блоге: 30
21.10.2014, 18:37 16
Лучший ответ Сообщение было отмечено svarga как решение

Решение

Цитата Сообщение от svarga Посмотреть сообщение
тоесть условие не срабатывает и появляется сообщение что Х не может быть больше....
Тут немного другая проблема. Ты вводишь число через scanf и хранишь его во float. А в исходнике программы пишешь 20.34 и такая константа имеет тип double. У типа double более высокая точность, чем у float'а и чиcло 20.34, хранимое во float'е или в double имеет немного разные значения

Если ты напишешь в программе "20.34f", то такая константа будет иметь тип float и должна совпасть с тем, что ты введёшь в scanf
2
nmcf
6535 / 5758 / 2622
Регистрация: 14.04.2014
Сообщений: 24,498
21.10.2014, 18:37 17
Так попробуй.
C++
1
2
3
4
5
6
float x, y, c = 20.34;
    printf ("Введи X (-3.14) x = ");
    scanf ("%f",&x);
 
    if (x > c)
        printf("X не может быть больше 20.34\n");
0
svarga
1 / 1 / 1
Регистрация: 14.02.2013
Сообщений: 60
21.10.2014, 18:43  [ТС] 18
20,34f - да это то что мне было нужно!!! Спасибо теперь работает всё как надо.
0
Evg
Эксперт CАвтор FAQ
20926 / 8063 / 623
Регистрация: 30.03.2009
Сообщений: 22,380
Записей в блоге: 30
21.10.2014, 18:46 19
Если бы ты сразу же поставил вопрос правильно, то с первого поста наверняка получил бы нужный ответ
0
21.10.2014, 18:46
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2014, 18:46

Не меняет значение массива в родительском классе
Доброго времени суток! Помогите плиииз, а то бомбит. В общем, есть родительский класс First,...

Константный указатель на константу меняет значение
int d = 7; const int* const cd = &d; d = 8; qDebug()<<*cd;

Программа которая меняет местами значение вещественных переменных а и в
Программа которая меняет местами значение вещественных переменных а и в. Помогите пожалуйста!!))


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.