Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / float что за чудеса? / 12 сообщений из 12, страница 1 из 1
17.05.2013, 16:33
    #38262356
Katamaran1987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float что за чудеса?
Добрый день, решил немного посчитать вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <stdio.h>
bool is_clear_bit(const float koef,unsigned idx)
{
    bool result = false;
    if(koef<=1)
    {
        float map_to_node = koef * float(idx);
        unsigned source = (unsigned)map_to_node;
        float map_to_node_next = map_to_node+koef;
        result = source >= map_to_node && map_to_node+1 < source+1
              || source <= map_to_node && map_to_node_next <= source+1;
    }
    return result;
}

int main(int a_argc, char** a_argv)
{
    for(unsigned i=0;i<100;++i)
    {
        printf("%d = %d\n",i,is_clear_bit(0.1f,i));
    }
    return 0;
}


вывод следущий:
0 = 1
...
80 = 1
81 = 1
82 = 1
83 = 1
84 = 1
85 = 1
86 = 1
87 = 1
88 = 1
89 = 0
90 = 1
91 = 1
92 = 1
93 = 1
94 = 1
95 = 1
96 = 1
97 = 1
98 = 1
99 = 0
откуда появились 0 и как это предотвротить?
...
Рейтинг: 0 / 0
17.05.2013, 16:38
    #38262373
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float что за чудеса?
Katamaran1987откуда появились 0 и как это предотвротить?

У float точность - шесть знаков после запятой. Ты точно уверен, что понимаешь как работают
в компьютерах числа с плавающей запятой и что они тебе нужны?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.05.2013, 16:46
    #38262385
Katamaran1987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float что за чудеса?
Dimitry SibiryakovKatamaran1987откуда появились 0 и как это предотвротить?

У float точность - шесть знаков после запятой. Ты точно уверен, что понимаешь как работают
в компьютерах числа с плавающей запятой и что они тебе нужны?..
расскажи коль не трудно
...
Рейтинг: 0 / 0
17.05.2013, 17:05
    #38262421
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float что за чудеса?
Dimitry SibiryakovKatamaran1987откуда появились 0 и как это предотвротить?

У float точность - шесть знаков после запятой. Ты точно уверен, что понимаешь как работают
в компьютерах числа с плавающей запятой и что они тебе нужны?..


У float точность - в количестве ДВОИЧНЫХ знаков после запятой.
Десятичную можно только примерно указать.
...
Рейтинг: 0 / 0
17.05.2013, 17:06
    #38262426
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float что за чудеса?
Katamaran1987Dimitry Sibiryakovпропущено...

У float точность - шесть знаков после запятой. Ты точно уверен, что понимаешь как работают
в компьютерах числа с плавающей запятой и что они тебе нужны?..
расскажи коль не трудно

Всё уже рассказано до нас...
http://ru.wikipedia.org/wiki/Числа_с_плавающей_запятой
...
Рейтинг: 0 / 0
17.05.2013, 18:02
    #38262508
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float что за чудеса?
MasterZivУ float точность - в количестве ДВОИЧНЫХ знаков после запятой.
Десятичную можно только примерно указать.
Это если вы будете считать дробное колво цифр - тогда да :)
А с практической точки зрения точнось мантиссы float ровно 7 десятичных цифр (суммарно до и после точки).
...
Рейтинг: 0 / 0
17.05.2013, 18:20
    #38262540
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float что за чудеса?
Katamaran1987,
Смотри ещё чудеса:

Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
                                                                                                                                                                         
#include <stdio.h>

bool is_clear_bit(const float koef,unsigned idx)
{
  bool result = false;
  if( koef <= 1 )
    {
      float map_to_node = koef * float(idx);
      unsigned source = (unsigned)map_to_node;
      float map_to_node_next = map_to_node + koef;
      result = source >= map_to_node && map_to_node+1 < source+1
            || source <= map_to_node && map_to_node_next <= source+1;
    }
  return result;
}

bool is_clear_bit2( const float koef, unsigned idx )
{
  if( koef <= 1 )
    {
      return unsigned( koef * float(idx) ) >= float( koef * float(idx) ) && float( koef * float(idx) ) + 1 <  unsigned( koef * float(idx) ) + 1
          || unsigned( koef * float(idx) ) <= float( koef * float(idx) ) && float( koef * float(idx + 1) ) <= unsigned( koef * float(idx) ) + 1
      ;
    }
  else
    return false;
}

int main(int a_argc, char** a_argv)
{
  for(unsigned i=0;i<100;++i)
    {
      printf( "%d = %d, %d\n", i, is_clear_bit(0.1f,i)?1:0, is_clear_bit2( 0.1f, i )?1:0 );
    }
  return 0;
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
ziv@mule:~/tmp$ g++ -o float float.cpp && ./float 
0 = 1, 1
1 = 1, 1
...
87 = 1, 1
88 = 1, 1
89 = 0, 1
90 = 1, 1
91 = 1, 1
92 = 1, 1
93 = 1, 1
94 = 1, 1
95 = 1, 1
96 = 1, 1
97 = 1, 1
98 = 1, 1
99 = 0, 1

...
Рейтинг: 0 / 0
17.05.2013, 18:23
    #38262542
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float что за чудеса?
Anatoly MoskovskyMasterZivУ float точность - в количестве ДВОИЧНЫХ знаков после запятой.
Десятичную можно только примерно указать.
Это если вы будете считать дробное колво цифр - тогда да :)
А с практической точки зрения точнось мантиссы float ровно 7 десятичных цифр (суммарно до и после точки).

Проблема-то ещё и в том, что на самом деле точности никакой и нет.
...
Рейтинг: 0 / 0
17.05.2013, 18:33
    #38262558
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float что за чудеса?
Katamaran1987, ты бы кстати объяснил бы, что это условие обозначает:

Код: plaintext
1.
2.
        result = source >= map_to_node && map_to_node+1 < source+1
              || source <= map_to_node && map_to_node_next <= source+1;
...
Рейтинг: 0 / 0
17.05.2013, 18:51
    #38262590
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float что за чудеса?
MasterZivПроблема-то ещё и в том, что на самом деле точности никакой и нет.
Точность есть. Тольео она относится к мантиссе, а не ко всему числу.
Если помнить об этом, то проблемы никакой нет.
...
Рейтинг: 0 / 0
18.05.2013, 20:24
    #38263519
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float что за чудеса?
Anatoly MoskovskyMasterZivПроблема-то ещё и в том, что на самом деле точности никакой и нет.
Точность есть. Только она относится к мантиссе, а не ко всему числу.
Если помнить об этом, то проблемы никакой нет.

Не совсем. Когда происходит потеря значимости, это происходит как раз по причине большой разницы в порядках.
...
Рейтинг: 0 / 0
19.05.2013, 00:56
    #38263663
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
float что за чудеса?
MasterZivНе совсем. Когда происходит потеря значимости, это происходит как раз по причине большой разницы в порядках.
Это прямое следствие того, о чем я сказал.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / float что за чудеса? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]