фигня с double
Забиваю их значениями,
делаю
x = x - y - z
TRACE выводит что x = -0.000000
Что за сабж?
double x, y, z;
Забиваю их значениями,
делаю
x = x - y - z
TRACE выводит что x = -0.000000
Что за сабж?
Что за значения то. А так -0.0 = + 0.0 в вычислительном смысле, только хранятся по разному.
Что за значения то. А так -0.0 = + 0.0 в вычислительном смысле, только хранятся по разному.
Значения такие, что
x == y + z
Но при сравнении имеем
x != y + z.
Чтоб заработало, пришлось вот так извратиться:
if ((x + y + z)/2 <= x)
Этм ловлю случаи x >= y + z :D Выглядит странно, но по другому никак не хотело сравниваться.
Если после x=y+z стоит TRACE и тогда x != y + z, то это странно.
Но если между ними есть команды с указателями или с обработкой какого-то массива или strcpy(), то не исключено, что некоторые из них затирают значения этих переменных.
Нет. С этим проблем нет. Фишка еще какая: при отображении TRACEом если значение выводить через %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 с округлением до сотых долей
ИМХО такие траблы могут возникнуть из-за различных сочетаний мантисса-степень е при экспоненциальном представлении числа.
Т.е. числа равны, но при этом при прямом сравнении двух QWORD они различаются.
Звучит не плохо. Но на Visual C временами пишут и банковские программы:).
В том-то и дело. Значит проблемма решаема.
Если думаешь могу посмотреть ту часть кода, которая дает ошибку.
Спасибо, разберусь лучше сам. Так оно полезнее будет. ;)
_control87, _controlfp
Get and set the floating-point control word.
И пример из MSDN:
/* 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
Ну а если не секрет, в чем ты разобрался? :roll:
Выставил округление в меньшую сторону - все проблемы решились.
_control87(_RC_UP, _MCW_RC);
До этого округлял собственными силами - помогало только частично.