Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

фигня с double

1.6K
05 июля 2004 года
Tdr
154 / / 13.11.2003
double x, y, z;

Забиваю их значениями,
делаю
x = x - y - z
TRACE выводит что x = -0.000000

Что за сабж?
527
05 июля 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by Tdr
double x, y, z;

Забиваю их значениями,
делаю
x = x - y - z
TRACE выводит что x = -0.000000

Что за сабж?


Что за значения то. А так -0.0 = + 0.0 в вычислительном смысле, только хранятся по разному.

1.6K
05 июля 2004 года
Tdr
154 / / 13.11.2003
Цитата:
Originally posted by pavor

Что за значения то. А так -0.0 = + 0.0 в вычислительном смысле, только хранятся по разному.


Значения такие, что
x == y + z
Но при сравнении имеем
x != y + z.
Чтоб заработало, пришлось вот так извратиться:
if ((x + y + z)/2 <= x)
Этм ловлю случаи x >= y + z :D Выглядит странно, но по другому никак не хотело сравниваться.

1.6K
05 июля 2004 года
Tdr
154 / / 13.11.2003
Цитата:
Originally posted by elan

Если после x=y+z стоит TRACE и тогда x != y + z, то это странно.

Но если между ними есть команды с указателями или с обработкой какого-то массива или strcpy(), то не исключено, что некоторые из них затирают значения этих переменных.


Нет. С этим проблем нет. Фишка еще какая: при отображении TRACEом если значение выводить через %x, то одинаковые величины в разных переменных отображаются по разному. Наверное где-то здесь надо ковырять.

1.6K
06 июля 2004 года
Tdr
154 / / 13.11.2003
Шаблон
Цитата:
TRACE("x = %f\n", x);
TRACE("x = %x\n", x);
TRACE("y + z = %f\n", y + z);
TRACE("y + z = %x\n", y + z);


Вывод

Цитата:

x = 9.650000
x = cccccccd
y + z = 9.650000
y + z = ccccccc8


А значения у меня идут в диапазоне от 0 до 100 с округлением до сотых долей

1.6K
06 июля 2004 года
Tdr
154 / / 13.11.2003
С этим тоже все чисто.

ИМХО такие траблы могут возникнуть из-за различных сочетаний мантисса-степень е при экспоненциальном представлении числа.
Т.е. числа равны, но при этом при прямом сравнении двух QWORD они различаются.
1.6K
07 июля 2004 года
Tdr
154 / / 13.11.2003
Цитата:
Originally posted by elan
Звучит не плохо. Но на Visual C временами пишут и банковские программы:).


В том-то и дело. Значит проблемма решаема.

Цитата:
Originally posted by elan
Если думаешь могу посмотреть ту часть кода, которая дает ошибку.


Спасибо, разберусь лучше сам. Так оно полезнее будет. ;)

1.6K
19 июля 2004 года
Tdr
154 / / 13.11.2003
Как и обещал, разобрался:

_control87, _controlfp

Get and set the floating-point control word.

И пример из MSDN:


Код:
Example

/* CNTRL87.C: This program uses _control87 to output the control
 * word, set the precision to 24 bits, and reset the status to
 * the default.
 */


#include <stdio.h>
#include <float.h>

void main( void )
{
   double a = 0.1;

   /* Show original control word and do calculation. */
   printf( "Original: 0x%.4x\n", _control87( 0, 0 ) );
   printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

   /* Set precision to 24 bits and recalculate. */
   printf( "24-bit:   0x%.4x\n", _control87( _PC_24, MCW_PC ) );
   printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

   /* Restore to default and recalculate. */
   printf( "Default:  0x%.4x\n",
          _control87( _CW_DEFAULT, 0xfffff ) );
   printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}

Output

Original: 0x9001f
0.1 * 0.1 = 1.000000000000000e-002
24-bit:   0xa001f
0.1 * 0.1 = 9.999999776482582e-003
Default:  0x001f
0.1 * 0.1 = 1.000000000000000e-002
1.6K
19 июля 2004 года
Tdr
154 / / 13.11.2003
Цитата:
Originally posted by elan
Ну а если не секрет, в чем ты разобрался? :roll:


Выставил округление в меньшую сторону - все проблемы решились.

_control87(_RC_UP, _MCW_RC);

До этого округлял собственными силами - помогало только частично.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог