Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Глюки преобразования ? / 19 сообщений из 19, страница 1 из 1
09.03.2007, 22:55
    #34381617
bdfy1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
проверяли вот на perl, python, c, java: print int( 32.98 * 100) - результат: 3297 - с чем связано ?
...
Рейтинг: 0 / 0
09.03.2007, 23:34
    #34381655
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
с отбрасыванием дробной части. это не глюки
чтобы было округления надо 0.5 прибавлять
...
Рейтинг: 0 / 0
09.03.2007, 23:38
    #34381660
bdfy1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
Ну так для других чисел все впорядке , в том числе и для .99 ???
...
Рейтинг: 0 / 0
09.03.2007, 23:39
    #34381662
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
32.98 * 100 это примерно 3297.9999999999995 - int - это отсечение дробной части
...
Рейтинг: 0 / 0
09.03.2007, 23:41
    #34381663
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
с#

Код: plaintext
1.
2.
3.
      int x =  (int) ( 32 . 98  *  100 );
      Console.Write(x);

...
Рейтинг: 0 / 0
09.03.2007, 23:51
    #34381671
zloy den
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
В Дельфи
Код: plaintext
Showmessage(inttostr(round( 32 . 98 * 100 )));
нормально выдает
...
Рейтинг: 0 / 0
09.03.2007, 23:52
    #34381672
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
bdfy1Ну так для других чисел все впорядке , в том числе и для .99 ???

не правда
Код: plaintext
1.
2.
3.
4.
5.
6.
    if (gVars.test) {      

      int x =  (int) ( 65 . 96  *  100 );
      Console.Write(x);
      return  5 ;
    }
...
Рейтинг: 0 / 0
09.03.2007, 23:58
    #34381677
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
zloy denВ Дельфи
Код: plaintext
Showmessage(inttostr(round( 32 . 98 * 100 )));
нормально выдает

выдай round(0.5)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    if (gVars.test) {      

      int x =  (int) ( 65 . 96  *  100 );
      int y = (int)  0 . 5 ;
      Console.Write(x);
      Console.Write("\n");

      Console.Write(y);
      return  5 ;
    }
...
Рейтинг: 0 / 0
10.03.2007, 00:05
    #34381680
bdfy1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
а причем тут тогда целая часть ? просто например для 63.96 все в порядке а вот для числа которое вы привели - .95 ... - Не вижу закономерности ....
...
Рейтинг: 0 / 0
10.03.2007, 00:05
    #34381681
zloy den
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
0 отвечает
...
Рейтинг: 0 / 0
10.03.2007, 00:08
    #34381684
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
bdfy1а причем тут тогда целая часть ? просто например для 63.96 все в порядке а вот для числа которое вы привели - .95 ... - Не вижу закономерности ....
я на 2 умножил 32.98
это от двоичного представления зависит
...
Рейтинг: 0 / 0
10.03.2007, 00:10
    #34381686
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
zloy den0 отвечает
мда?
тогда надо к Софтвареру.
он все знает
...
Рейтинг: 0 / 0
10.03.2007, 00:18
    #34381694
zloy den
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
Это точно
...
Рейтинг: 0 / 0
10.03.2007, 00:39
    #34381708
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
32.98 не может быть точно представлено в виде double, ибо в двоичном виде является бесконечной периодической дробью.

Хотите повеселиться? смотрите дальше
Код: plaintext
1.
2.
	double a= 32 . 98 ;
	double b= 32 . 979999999999997 ;
	if (a==b) _tprintf(_T("a=b"));
...
Рейтинг: 0 / 0
10.03.2007, 00:52
    #34381710
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
в алголе плавающие сравнивались приблизительно

Код: 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.
i = 27, x = 27, y = 27
i = 28, x = 28, y = 28 
i = 29, x = 28, y = 29  <----------------------------
i = 30, x = 30, y = 30
i = 31, x = 31, y = 31
i = 32, x = 32, y = 32
i = 33, x = 33, y = 33
i = 34, x = 34, y = 34
i = 35, x = 35, y = 35
i = 36, x = 36, y = 36
i = 37, x = 37, y = 37
i = 38, x = 38, y = 38
i = 39, x = 39, y = 39
i = 40, x = 40, y = 40
i = 41, x = 41, y = 41
i = 42, x = 42, y = 42
i = 43, x = 43, y = 43
i = 44, x = 44, y = 44
i = 45, x = 45, y = 45
i = 46, x = 46, y = 46
i = 47, x = 47, y = 47
i = 48, x = 48, y = 48
i = 49, x = 49, y = 49
i = 50, x = 50, y = 50
i = 51, x = 51, y = 51
i = 52, x = 52, y = 52
i = 53, x = 53, y = 53
i = 54, x = 54, y = 54
i = 55, x = 55, y = 55
i = 56, x = 56, y = 56
i = 57, x = 56, y = 57  <-------------------------
i = 58, x = 57, y = 58
i = 59, x = 59, y = 59



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
      int x =  (int) ( 65 . 96  *  100 );
      int y =  0 ;
      double f =  0 . 0 ;

      for (int i =  27 ; i <  60 ; i++) {
         f = i/ 100 . 0 ;
         x = (int )(f *  100 );
         y = (int )(f *  100  + . 5 );
         Console.Write("\ni = {0}, x = {1}, y = {2}", i, x, y);
      }
...
Рейтинг: 0 / 0
10.03.2007, 01:30
    #34381717
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
bdfy1проверяли вот на perl, python, c, java: print int( 32.98 * 100) - результат: 3297 - с чем связано ?
Связано с тем, что множества чисел с плавающей запятой, представимых в двоичной и десятичнй системах, не совпадают.
Современные процессоры оперируют двоичной системой.
Человек - десятичной.
При преобразовании выбирается наиболее близкое к оригинальному значение, но не тождественное значение.
...
Рейтинг: 0 / 0
10.03.2007, 17:14
    #34382102
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
епта, чудики, приехали.

ВСЕМ ЮЗАТЬ ROUNDЫ и курить IEEE754 !!!

аффтопитезь: объект либо именован, либо не существует
...
Рейтинг: 0 / 0
12.03.2007, 09:26
    #34383342
мод
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
SQLWKS> select floor(32.98*100) from dual
2>
FLOOR(32.9
----------
3298
Выбрана 1 строка.
...
Рейтинг: 0 / 0
13.03.2007, 12:32
    #34386782
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Глюки преобразования ?
C++ Language ReferenceWhen an object of floating type is converted to an integral type, the fractional part is truncated. No rounding takes place in the conversion process. Truncation means that a number like 1.3 is converted to 1, and –1.3 is converted to –1.
C# Programmer's ReferenceWhen you convert from a double or float value to an integral type, the value is rounded towards zero to the nearest integral value.

round же округляет более изощрённо
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Глюки преобразования ? / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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