Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
List2006
24 / 16 / 3
Регистрация: 19.12.2009
Сообщений: 366
1

double и for

28.07.2011, 16:42. Просмотров 1670. Ответов 30
Метки нет (Все метки)

Здравствуйте, объясните пожалуйста почему в операции:
C++
1
for (double y = .1; y != 1.0; y += .1)
получается бесконечный цикл, то есть проскакивает выражение 1.0 == 1.0 - как true

ps я знаю что не корректно использоваться не целочисленный "счетчик", но терзает любопытство почему...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2011, 16:42
Ответы с готовыми решениями:

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib>...

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)"
#include <iostream> #include <cmath> using namespace std; double Akk(double...

Почему мы пишем double x (double y)? а не через запятую double x,y
почему мы пишем double x (double y)? а не через запятую double x,y

Исправить ошибки "cannot convert 'double (*)(double)' to 'double'" и "too many arguments to function"
пожалуйста проверьте и помогите исправить ошибки: #include<iostream>...

Преобразовать 2 числа int в 1 число float(double) | double int1.int2
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения...

30
List2006
24 / 16 / 3
Регистрация: 19.12.2009
Сообщений: 366
28.07.2011, 19:32  [ТС] 21
а как можно получить кусок памяти в двоичной системе?
то есть хочу получить значение float i = 0.1; как оно лежит прям в памяти.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
28.07.2011, 19:33 22
Изъяснись точнее.
0
List2006
24 / 16 / 3
Регистрация: 19.12.2009
Сообщений: 366
28.07.2011, 19:36  [ТС] 23
а лучше покажите на примере как перевести 0.1 в представление float
то есть с мантиссами и прочими
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
28.07.2011, 19:37 24
float i = 0.1f;
0
List2006
24 / 16 / 3
Регистрация: 19.12.2009
Сообщений: 366
28.07.2011, 19:39  [ТС] 25
Цитата Сообщение от Deviaphan Посмотреть сообщение
Изъяснись точнее.
-хочу наглядно увидеть как С++ хранить число 0.1
-и попробовать самому перевести в число, чтобы наглядно понять как оно переходит в то число:
0.100000000000000005551115123125782702118158340454101562500000000000000000000000
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
28.07.2011, 19:43 26
Побитное представление
31 - бит знака
30-23 - порядок
22-0 - мантисса

За подробностями в гугл.

Добавлено через 1 минуту
Битовое представление можешь формировать в unsigned int, а потом присвоить float'y

C++
1
2
unsigned int v1 = ...;
float f = *((float*)&v1);
0
grizlik78
Эксперт С++
2016 / 1497 / 206
Регистрация: 29.05.2011
Сообщений: 3,118
28.07.2011, 19:49 27
Цитата Сообщение от List2006 Посмотреть сообщение
а как можно получить кусок памяти в двоичной системе?
В виде байтов можно посмотреть.
Преобразованием указателя, например. Ну, это уже показали.
Или с помощью объединения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
union float_bytes{
    float f;
    unsigned char b[sizeof(float)];
};
 
int main()
{
    float_bytes v;
    v.f = 0.1;
    for (unsigned i = 0; i < sizeof(float); ++i)
        std::cout << "0x" << std::hex << (unsigned)v.b[i] << std::endl;
    return 0;
}
Добавлено через 4 минуты
Что касается числа 0.1 то это есть прямо в английской википедии. Русскую не смотрел.
1
ValeryLaptev
Эксперт С++
1052 / 831 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
28.07.2011, 20:51 28
Цитата Сообщение от List2006 Посмотреть сообщение
а лучше покажите на примере как перевести 0.1 в представление float
то есть с мантиссами и прочими
Читать стандарт IEEE-754. В сети - дофига материалов.
Перевод дробных - умножением на основание системы счисления. В сети дофига материалов на эту тему.
0
easybudda
Модератор
Эксперт CЭксперт С++
10154 / 6059 / 1524
Регистрация: 25.07.2009
Сообщений: 11,484
28.07.2011, 21:22 29
Цитата Сообщение от grizlik78 Посмотреть сообщение
Или с помощью объединения
Поздно я это заметил, сначала почти так же по-своему написал
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <limits.h>
 
#define LLBITS (CHAR_BIT * sizeof(long long))
 
typedef union {
    double dval;
    unsigned long long ival;
} un_t;
 
int main(void){
    un_t un;
    int i;
    
    if ( sizeof(double) != sizeof(long long) ){
        printf("Shit happens!\n");
        return 1;
    }
    
    while ( ( i = LLBITS ) && printf("\nDouble value: ") && scanf("%lf", &un.dval) == 1 )
        while ( i )
            printf("%d", ( un.ival >> --i ) & 1);
    
    return 0;
}
1
rangerx
1944 / 1553 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
28.07.2011, 23:52 30
Цитата Сообщение от List2006 Посмотреть сообщение
и попробовать самому перевести в число
1) 0.1 * 2 = 0.2
2) 0.2 * 2 = 0.4
3) 0.4 * 2 = 0.8
4) 0.8 * 2 = 1.6
5) 0.6 * 2 = 1.2
6) 0.2 * 2 = 0.4 // зациклились, повторяется п. 2, получилась периодическая дробь

0.1d = 0.0(0011)b

Т.е. умножаешь на 2 пока не наберётся необходимое количество разрядов либо не получится 0 в мантиссе, например:
1) 0.5 * 2 = 1.0
0.5d = 0.1b
2
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
29.07.2011, 07:33 31
Неочевидные ответы на простые вопросы
5 раздел.
2
29.07.2011, 07:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2011, 07:33

Почему перестает работать программа при замене double на long double?
Здравствуйте! Прошу помощи чтобы разобраться в следующем вопросе: Нашел...

Какая-нибудь реализация функции void Fun (double in, double *out)
Подскажите, пожалуйста, какую-нибудь любую реализацию прототипа функции: void...

long double и double в MSVC 12 одно и тоже, нужна информация,желательно быстрей
Здравствуйте все знают что в VC long double и double одно и тоже, да и при...


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

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

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