#define INV_RAND_MAX (1.0f / float (0x7fff))
class CRandGen
{
public :
CRandGen() : m_seed(1L) {}
CRandGen( unsigned int seed ) : m_seed(seed) {}
void Init( unsigned int seed ) { m_seed = seed; }
float RandFloat() { return float (RandInt()) * INV_RAND_MAX; }
int RandInt()
{
m_seed = m_seed * 214013L + 2531011L;
return ((m_seed >> 16) & 0x7fff);
}
private :
unsigned long m_seed;
};
void test(float x, float y, float z)
{
std::cout<<x<<"\n" <<y<<"\n" <<z<<"\n" ;
}
int main()
{
float k=123;
CRandGen m_randGen;
test((m_randGen.RandFloat() - 0.5f)*k
,(m_randGen.RandFloat() - 0.5f)*k
,(m_randGen.RandFloat() - 0.5f)*k
);
test((m_randGen.RandFloat() - 0.5f)*k
,(m_randGen.RandFloat() - 0.5f)*k
,(m_randGen.RandFloat() - 0.5f)*k
);
test((m_randGen.RandFloat() - 0.5f)*k
,(m_randGen.RandFloat() - 0.5f)*k
,(m_randGen.RandFloat() - 0.5f)*k
);
return 0;
}
Релиз
-37.7236
-37.7236
-37.7236
-2.47562
-2.47562
-2.47562
39.7093
39.7093
39.7093
Дебуг
-37.7236
7.82099
-61.3461
-2.47562
10.4561
37.9751
39.7093
48.7034
-18.4142
Самое смешное что побочные эффекты на месте но не поле кажного вызова, а после всех.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Очевидно, что компилятор неправильно оптимизирует код — вычисляет аргумент один раз. Следовательно, в релиз-версии нужно эту оптимизацию отключить
Евгений Коробко
От:
shmakov
Дата: 12.10.04 12:25
Оценка:
Не знаю — попробовал — у меня в Debug & Release один и тот же результат... VS.NET — 2003
-37.7236
-37.7236
-37.7236
-2.47562
-2.47562
-2.47562
39.7093
39.7093
39.7093
От:
Шахтер
Дата: 12.10.04 16:07
Оценка:
Здравствуйте, WolfHound, Вы писали: ...
Сталкивался с аналогичной проблемой. Раскоп показал, что, похоже, компилятор забывает вставить точку следования после вызова функции. Это не имеет значения для вызываемых функций, но для встроенных приводит к эффектам описаным выше, когда безобидный unspecified behavior превращается в злобный undefined behavior.
В XXI век с
CCore .
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
От:
siv
Дата: 29.08.06 06:41
Оценка:
1 (1)
Уже не актуально. После установки SP1 генерирует в релизе правильный код.
Здравствуйте, siv, Вы писали:
siv>Уже не актуально. После установки SP1 генерирует в релизе правильный код.
На дату посмотри чтоли.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
siv>>Уже не актуально. После установки SP1 генерирует в релизе правильный код.
WH>На дату посмотри чтоли.
Сообщение о неактуальности в любом случае уместно.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить