Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 19

Пропуск строк кода

08.02.2013, 01:00. Показов 3913. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При построении проекта с шаблоном Release при выполнении программы пропускаются некоторые строки кода. Включена опция "Оптимизация - максимальная скорость", при её выключении все нормально. Но эта опция мне необходима...
C++
1
2
3
4
5
6
7
8
9
10
int mutate(double propability, double coefficient)
{
    double chance = rand() * 1.0 / RAND_MAX; //Эта строка пропускается. Переменную chance не видно при отладке.
 
    if(chance <= propability) //Но здесь никакой ошибки не выдает
    {
        <...>
    }
    <...>
}
Подскажите, как решить эту проблему, при этом сохранив оптимизацию...

Добавлено через 5 минут
Похоже, что if тоже вообще не выполняется...
При
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int mutate(double propability, double coefficient)
{
    double chance = rand() * 1.0 / RAND_MAX; //Эта строка пропускается. Переменную chance не видно при отладке.
 
    if(chance <= propability) //Но здесь никакой ошибки не выдает
    {
        <...>
    }
    else
    {
        <...>
    }
    <...>
}
не выполняется ни одна ветвь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.02.2013, 01:00
Ответы с готовыми решениями:

Пропуск строк в текстовом файле
Здравствуйте! Допустим, у меня есть очень большой текстовый файл и мне нужно считать строки, скажем, с 14140 по 14142. Можно ли сделать это...

Работа с OLE сервер Excel: пропуск строк
Добрый вечер))) столкнулся с такой проблемой. выгружаю данные в Excel из Builder те поля, которые я выбрал в списке. Как...

Пропуск строк кода на C
При изучении Си в простых программах часто бывает так, что комп пропускает исполнение некоторых строк кода, и я никак не могу понять почему...

20
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
08.02.2013, 05:18
Цитата Сообщение от Altaire Посмотреть сообщение
При построении проекта с шаблоном Release при выполнении программы пропускаются некоторые строки кода.
Само собой. Компилятор оптимизирует код, поэтому и не совпадают строчки.
А для отладки есть debug режим
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
08.02.2013, 09:05
Цитата Сообщение от Altaire Посмотреть сообщение
не выполняется ни одна ветвь.
сама то функция хоть раз вызывается?
а потом как ты проверил что не выполняется ??
точки останова ставил??
так они не пройдут поскольку код изменился
делай отладочную печать
например в каждую ветку запихай printf (MessageBox если работаешь с окнами)
0
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 19
08.02.2013, 14:38  [ТС]
Функция запускается. Построчное выполнение.

Debug режим - не вариант. Мне требуется скорость для основного выполнения программы. Разница - в восемь раз.

Как он решает какие строчки удалять? Они ведь должны выполнятся - инициализируемые переменные используются...
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.02.2013, 15:47
Altaire, предположу что ты решил что
Цитата Сообщение от Altaire Посмотреть сообщение
double chance = rand() * 1.0 / RAND_MAX;
пропускается т.к в ходе работы не получаешь случ чисел. Так вот ты забыл srand(time(0)) - начальную установку генератора случ чисел. Release CALL rand не удаляет, я на 90% уверне что ты код неверно написал не ввёдя в него srand
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
08.02.2013, 16:27
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
пропускается т.к в ходе работы не получаешь случ чисел. Так вот ты забыл srand(time(0)) - начальную установку генератора случ чисел.
здесь возможен еще один вариант
C++
1
int rand( void );
возвращает int
rand() * 1.0 приводится к int и
C++
1
double chance = rand() * 1.0 / RAND_MAX;
превращается в 0
и все это действие
Цитата Сообщение от Altaire Посмотреть сообщение
if(chance <= propability) //Но здесь никакой ошибки не выдает
* * {
заменяется на
C++
1
2
if(0<= propability)
{
но это мои предположения без отладочной печати или ассемблерного листинга можно долго гадать
Цитата Сообщение от Altaire Посмотреть сообщение
Разница - в восемь раз.
интересно как узнал???
и вообще принято приводить полный листинг может у тебя ветвление выбрасывается
Цитата Сообщение от Altaire Посмотреть сообщение
Как он решает какие строчки удалять?
А давайте все вместе гадать
вместо того чтобы привести код программы и ассемблерный листинг что он скомпилировал
0
08.02.2013, 17:01

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
возвращает int
rand() * 1.0 приводится к int и
- такой вариант НЕВОЗМОЖНЕН приводиться тип будет всегда к double (повышающее преобразование)
Цитата Сообщение от ValeryS Посмотреть сообщение
double chance = 1.0*rand() / RAND_MAX;
- вот при таком построении возможно получить 1.0*0 в добавок отмечу для автора тему что случайное число в диапазоне 0 - RAND_MAX получаем не вот так
C++
1
rand() / RAND_MAX
а вот так
C++
1
rand() % RAND_MAX

0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
08.02.2013, 17:07
компилятор вполне мог вырезать умножение на 1
0
08.02.2013, 17:23

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
компилятор вполне мог вырезать умножение на 1.0
студийный нет

0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.02.2013, 17:35
Altaire, посомтри как меняет картину srand и какие значения чисел мы генерируем(они все в диапазоне 0 - 1(!), это пишу на случай если вероятность не как коэффициент 0-1 а как процент используешь. Запомни при / RAND_MAX чисел свыше 1 не получишь, их можно получить если запрашивать остаток от целочисленного деления т.е % RAND_MAX)
Миниатюры
Пропуск строк кода  
0
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 19
08.02.2013, 19:16  [ТС]
srand() у меня вызывается, но только далеко от этой функции. Просто когда-то он у меня вызывался перед каждым куском кода с рандомом, но как раз рандомности это не обеспечивало - время не менялось от srand() к srand() и последовательность случайных чисел получалась та же самая. Вот я и решил запускать srand() лишь в одном месте проекта.

rand() возвращает случайное целое число от нуля до RAND_MAX (библиотечная константа). Мне нужно именно вещественное от 0 до 1. Я привожу возвращаемое значение к double ( * 1.0) и делю на максимум.

Аномалия, оказывается, еще более странная... При добавлении отладочной печати переменная берет и появляется.

Через дизассеблер виден тот же код, но без строчки
C++
1
double chance = ...;
.
При добавлении печати типа
C++
1
System::IO::File::AppendAllText("log.txt", "Hello");
в дизассемблере появляются обе. И chance становится видно.

Полный код функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int Neuron::mutate(double propability, double coefficient) {
    double chance = rand() * 1.0 / RAND_MAX;
 
    //System::IO::File::AppendAllText("log.txt", "Hello\n");
 
    if(chance - propability) {
        int mut_weight = rand() % num_of_inputs;
 
        if(rand() % 2 == 1) {
            input_weights[mut_weight] = input_weights[mut_weight] * (1 + coefficient);
        }
        else {
            input_weights[mut_weight] = input_weights[mut_weight] * (1 - coefficient);
        }
    }
    else {
        chance = 1.0;
    }
    
    return 0;
}
Добавлено через 2 минуты
При этом
C++
1
2
srand(time(0))
double chance = rand() * 1.0 / RAND_MAX;
Эффекта не дает.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
08.02.2013, 19:22
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
такой вариант НЕВОЗМОЖНЕН приводиться тип будет всегда к double (повышающее преобразование)
согласен, не прав
0
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 19
08.02.2013, 19:26  [ТС]
В предыдущем - достаточный листинг.
Какой вам еще нужен? Весь - 2500 строчек, 1500 из которых - мои.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
08.02.2013, 19:27
Цитата Сообщение от Altaire Посмотреть сообщение
Аномалия, оказывается, еще более странная... При добавлении отладочной печати переменная берет и появляется.
а ты не думаешь что она используется один раз, и нет смысла загонять её в память, она остается в EAX
а если учесть что это регистр который используется при возвращении значений из функций то явного присвоения ты и не увидишь

Функция в релизе правильно работает?
если да не бери в голову, компилятор может даже поменять порядок выполнения

Добавлено через 21 секунду
Цитата Сообщение от Altaire Посмотреть сообщение
В предыдущем - достаточный листинг.
Ассемблерный
0
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 19
08.02.2013, 19:35  [ТС]
Assembler
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
--- c:\users\altaire\documents\visual studio 2010\projects\fishes\fishes\neuron.cpp 
    61:     if(chance <= propability) {
00000000  push        ebp 
00000001  mov         ebp,esp 
00000003  sub         esp,38h 
00000006  mov         dword ptr [ebp-4],ecx 
00000009  cmp         dword ptr ds:[000E319Ch],0 
00000010  je          00000017 
00000012  call        FD86DE51 
00000017  xor         edx,edx 
00000019  mov         dword ptr [ebp-8],edx 
0000001c  xor         edx,edx 
0000001e  mov         dword ptr [ebp-14h],edx 
00000021  xor         edx,edx 
00000023  mov         dword ptr [ebp-0Ch],edx 
00000026  xor         edx,edx 
00000028  mov         dword ptr [ebp-10h],edx 
0000002b  xor         edx,edx 
0000002d  mov         dword ptr [ebp-18h],edx 
00000030  xor         edx,edx 
00000032  mov         dword ptr [ebp-24h],edx 
00000035  xor         edx,edx 
00000037  mov         dword ptr [ebp-1Ch],edx 
0000003a  xor         edx,edx 
0000003c  mov         dword ptr [ebp-20h],edx 
0000003f  xor         edx,edx 
00000041  mov         dword ptr [ebp-2Ch],edx 
00000044  xor         edx,edx 
00000046  mov         dword ptr [ebp-28h],edx 
00000049  call        FC508254 
0000004e  mov         dword ptr [ebp-30h],eax 
00000051  fild        dword ptr [ebp-30h] 
00000054  fdiv        dword ptr ds:[04661CE0h] 
0000005a  fld         qword ptr [ebp+10h] 
0000005d  fcomip      st,st(1) 
0000005f  fstp        st(0) 
00000061  jp          00000185 
00000067  jb          00000185 
    62:         int mut_weight = rand() % num_of_inputs;
0000006d  call        FC508254 
00000072  mov         dword ptr [ebp-34h],eax 
00000075  mov         eax,dword ptr [ebp-34h] 
00000078  mov         edx,dword ptr [ebp-4] 
0000007b  mov         ecx,dword ptr [edx+20h] 
0000007e  cdq 
0000007f  idiv        eax,ecx 
00000081  mov         dword ptr [ebp-8],edx 
    63: 
    64:         if(rand() % 2 == 1) {
00000084  call        FC508254 
00000089  mov         dword ptr [ebp-38h],eax 
0000008c  mov         eax,dword ptr [ebp-38h] 
0000008f  and         eax,80000001h 
00000094  jns         0000009B 
00000096  dec         eax 
00000097  or          eax,0FFFFFFFEh 
0000009a  inc         eax 
0000009b  cmp         eax,1 
0000009e  jne         00000111 
    65:             input_weights[mut_weight] = input_weights[mut_weight] * (1 + coefficient);
000000a0  mov         eax,dword ptr [ebp-4] 
000000a3  add         eax,8 
000000a6  mov         dword ptr [ebp-24h],eax 
000000a9  mov         eax,dword ptr [ebp-24h] 
000000ac  mov         dword ptr [ebp-18h],eax 
000000af  mov         eax,dword ptr [ebp-18h] 
000000b2  mov         eax,dword ptr [eax+10h] 
000000b5  mov         edx,dword ptr [ebp-18h] 
000000b8  sub         eax,dword ptr [edx+0Ch] 
000000bb  sar         eax,3 
000000be  cmp         eax,dword ptr [ebp-8] 
000000c1  ja          000000C8 
000000c3  call        FC5081E8 
000000c8  mov         eax,dword ptr [ebp-8] 
000000cb  shl         eax,3 
000000ce  mov         edx,dword ptr [ebp-18h] 
000000d1  add         eax,dword ptr [edx+0Ch] 
000000d4  mov         dword ptr [ebp-2Ch],eax 
000000d7  mov         eax,dword ptr [ebp-24h] 
000000da  mov         dword ptr [ebp-14h],eax 
000000dd  mov         eax,dword ptr [ebp-14h] 
000000e0  mov         eax,dword ptr [eax+10h] 
000000e3  mov         edx,dword ptr [ebp-14h] 
000000e6  sub         eax,dword ptr [edx+0Ch] 
000000e9  sar         eax,3 
000000ec  cmp         eax,dword ptr [ebp-8] 
000000ef  ja          000000F6 
000000f1  call        FC5081E8 
000000f6  mov         eax,dword ptr [ebp-14h] 
000000f9  mov         eax,dword ptr [eax+0Ch] 
000000fc  mov         edx,dword ptr [ebp-8] 
000000ff  fld         qword ptr [ebp+8] 
00000102  fld1 
00000104  faddp       st(1),st 
00000106  mov         ecx,dword ptr [ebp-2Ch] 
00000109  fmul        qword ptr [ecx] 
0000010b  fstp        qword ptr [eax+edx*8] 
    66:         }
    67:         else {
0000010e  nop 
0000010f  jmp         00000185 
    68:             input_weights[mut_weight] = input_weights[mut_weight] * (1 - coefficient);
00000111  mov         eax,dword ptr [ebp-4] 
00000114  add         eax,8 
00000117  mov         dword ptr [ebp-20h],eax 
0000011a  mov         eax,dword ptr [ebp-20h] 
0000011d  mov         dword ptr [ebp-10h],eax 
00000120  mov         eax,dword ptr [ebp-10h] 
00000123  mov         eax,dword ptr [eax+10h] 
00000126  mov         edx,dword ptr [ebp-10h] 
00000129  sub         eax,dword ptr [edx+0Ch] 
0000012c  sar         eax,3 
0000012f  cmp         eax,dword ptr [ebp-8] 
00000132  ja          00000139 
00000134  call        FC5081E8 
00000139  mov         eax,dword ptr [ebp-8] 
0000013c  shl         eax,3 
0000013f  mov         dword ptr [ebp-1Ch],eax 
00000142  mov         eax,dword ptr [ebp-10h] 
00000145  mov         eax,dword ptr [eax+0Ch] 
00000148  add         eax,dword ptr [ebp-1Ch] 
0000014b  mov         dword ptr [ebp-28h],eax 
0000014e  mov         eax,dword ptr [ebp-20h] 
00000151  mov         dword ptr [ebp-0Ch],eax 
00000154  mov         eax,dword ptr [ebp-0Ch] 
00000157  mov         eax,dword ptr [eax+10h] 
0000015a  mov         edx,dword ptr [ebp-0Ch] 
0000015d  sub         eax,dword ptr [edx+0Ch] 
00000160  sar         eax,3 
00000163  cmp         eax,dword ptr [ebp-8] 
00000166  ja          0000016D 
00000168  call        FC5081E8 
0000016d  mov         eax,dword ptr [ebp-0Ch] 
00000170  mov         eax,dword ptr [eax+0Ch] 
00000173  mov         edx,dword ptr [ebp-1Ch] 
00000176  fld         qword ptr [ebp+8] 
00000179  fld1 
0000017b  fsubrp      st(1),st 
0000017d  mov         ecx,dword ptr [ebp-28h] 
00000180  fmul        qword ptr [ecx] 
00000182  fstp        qword ptr [eax+edx] 
    69:         }
    70:     }
    71:     else {
    72:         chance = 1.0;
    73:     }
    74:     return 0;
00000185  xor         eax,eax 
00000187  mov         esp,ebp 
00000189  pop         ebp 
0000018a  ret         10h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int Neuron::mutate(double propability, double coefficient) {
    double chance = rand() * 1.0 / RAND_MAX;
 
 
    if(chance <= propability) {
        int mut_weight = rand() % num_of_inputs;
 
        if(rand() % 2 == 1) {
            input_weights[mut_weight] = input_weights[mut_weight] * (1 + coefficient);
        }
        else {
            input_weights[mut_weight] = input_weights[mut_weight] * (1 - coefficient);
        }
    }
    else {
        chance = 1.0;
    }
    return 0;
}
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
08.02.2013, 20:10
ну вот она твоя строчка

Цитата Сообщение от Altaire Посмотреть сообщение
double chance = rand() * 1.0 / RAND_MAX;
if(chance <= propability) {
Assembler
1
2
3
4
5
6
7
8
9
call        FC508254 ;  // rand()
  mov         dword ptr [ebp-30h],eax ; // то что вернула rand()
  fild        dword ptr [ebp-30h] ;     // загоняем в сопроцессор        
  fdiv        dword ptr ds:[04661CE0h] ; // делим на константу 
  fld         qword ptr [ebp+10h] ; загоняем в сопроцессор параметр
  fcomip      st,st(1) 
  fstp        st(0) ; //сравниваем
  jp          00000185 
  jb          00000185 ; //преходим
как видишь твоя переменная chance даже из сопроцессора не вылезла (потому что не нужна никому)


Цитата Сообщение от Altaire Посмотреть сообщение
else {
* * 72: * * * * chance = 1.0;
* * 73: * * }
* * 74: * * return 0;
00000185 *xor * * * * eax,eax
00000187 *mov * * * * esp,ebp
00000189 *pop * * * * ebp
0000018a *ret * * * * 10h
выбросил ветку как ненужную

Добавлено через 18 минут

Не по теме:

-=ЮрА=-, а умножение то на 1.0 выкинуто:)

0
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 19
08.02.2013, 20:18  [ТС]
Насчет "как видишь" - могу лишь верить. В ассемблере ни бум-бум.

Но что тогда с этим делать?

Получается даже не такое, в итоге:
C++
1
    if(rand() * 1.0 / RAND_MAX <= propability)
а вообще что-то другое?

Что же с этим делать?

На данный момент сделал
C++
1
    if(rand() * 1.0 / RAND_MAX <= propability)
На глазок - работает... Но не знаю как проверить...
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
08.02.2013, 20:41
Цитата Сообщение от Altaire Посмотреть сообщение
Получается даже не такое, в итоге:
C++
1
if(rand() * 1.0 / RAND_MAX <= propability)
а вообще что-то другое?
именно это и получается
разве что умножение выкинул
просто он объединил
C++
1
2
 double chance = rand() * 1.0 / RAND_MAX;
      if(chance <= propability)
потому ты свою переменную и не видишь, она из сопра не вылазит
а если делать печать то тогда она вылезет из сопроцессора и ты её видишь

Цитата Сообщение от Altaire Посмотреть сообщение
На глазок - работает... Но не знаю как проверить...
анализом листинга
еще раз приведу тебе попытаюсь подробно описать
вызвать функцию rand
Assembler
1
call        FC508254 ;  // rand()
то что она вернула записать в сопроцессор
напрямую из регистра в сопроцессор записать нельзя используем память
Assembler
1
2
  mov         dword ptr [ebp-30h],eax ; // то что вернула rand()
  fild        dword ptr [ebp-30h] ;     // загоняем в сопроцессор
разделить на RAND_MAX деление происходит в сопроцессоре
Assembler
1
 fdiv        dword ptr ds:[04661CE0h] ; // делим на константу
загрузить в сопроцессор propability
Assembler
1
 fld         qword ptr [ebp+10h] ; загоняем в сопроцессор параметр
сравниваем rand()/ RAND_MAX и propability
Assembler
1
 fcomip      st,st(1);  //сравниваем
пустая команда
Assembler
1
  fstp        st(0)
переход если выполняется
на самом деле здесь срабатывает обратное условие если
if(chance == propability) return 0;
Assembler
1
2
  jp          00000185 
  jb          00000185 ; //преходим
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.02.2013, 22:09
Цитата Сообщение от ValeryS Посмотреть сообщение
согласен, не прав
Assembler
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
1:    #include <iostream>
2:    using namespace std;
3:
4:    int main()
5:    {
00401030   push        ebp
00401031   mov         ebp,esp
00401033   sub         esp,4Ch
00401036   push        ebx
00401037   push        esi
00401038   push        edi
00401039   lea         edi,[ebp-4Ch]
0040103C   mov         ecx,13h
00401041   mov         eax,0CCCCCCCCh
00401046   rep stos    dword ptr [edi]
6:        double coef = rand() * 1.0/RAND_MAX;
00401048   call        rand (00408170)
0040104D   mov         dword ptr [ebp-0Ch],eax
00401050   fild        dword ptr [ebp-0Ch]
00401053   fmul        qword ptr [__real@8@3fff8000000000000000 (00432030)]
00401059   fdiv        qword ptr [__real@8@400dfffe000000000000 (00432020)]
0040105F   fstp        qword ptr [ebp-8]
7:        return 0;
00401062   xor         eax,eax
8:    }
00401064   pop         edi
00401065   pop         esi
00401066   pop         ebx
00401067   add         esp,4Ch
0040106A   cmp         ebp,esp
0040106C   call        __chkesp (00408250)
00401071   mov         esp,ebp
00401073   pop         ebp
00401074   ret
C++
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
 
int main()
{
    double coef = rand() * 1.0/RAND_MAX;
    return 0;
}
что и где в этом коде выкинуто
Assembler
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
--- D:\Microsoft Visual Studio\CyberForum\asmTest\asmTest.cpp  --------------------------------------------------------------------------------------------
12:
13:   int mutate(double propability, double coefficient)
14:   {
004010B0   push        ebp
004010B1   mov         ebp,esp
004010B3   sub         esp,58h
004010B6   push        ebx
004010B7   push        esi
004010B8   push        edi
004010B9   lea         edi,[ebp-58h]
004010BC   mov         ecx,16h
004010C1   mov         eax,0CCCCCCCCh
004010C6   rep stos    dword ptr [edi]
15:       double chance = rand() * 1.0 / RAND_MAX;
004010C8   call        rand (00408280)
004010CD   mov         dword ptr [ebp-18h],eax
004010D0   fild        dword ptr [ebp-18h]
004010D3   fmul        qword ptr [__real@8@3fff8000000000000000 (00432030)]
004010D9   fdiv        qword ptr [__real@8@400dfffe000000000000 (00432020)]
004010DF   fstp        qword ptr [ebp-8]
16:       double input_weights = 5;
004010E2   mov         dword ptr [ebp-10h],0
004010E9   mov         dword ptr [ebp-0Ch],40140000h
17:       if(chance - propability)
004010F0   fld         qword ptr [ebp-8]
004010F3   fsub        qword ptr [ebp+8]
004010F6   fcomp       qword ptr [__real@8@00000000000000000000 (00432040)]
004010FC   fnstsw      ax
004010FE   test        ah,40h
00401101   jne         mutate+9Bh (0040114b)
18:       {
19:           int mut_weight = rand() % 5;
00401103   call        rand (00408280)
00401108   cdq
00401109   mov         ecx,5
0040110E   idiv        eax,ecx
00401110   mov         dword ptr [mut_weight],edx
20:           if(rand() % 2 == 1)
00401113   call        rand (00408280)
00401118   and         eax,80000001h
0040111D   jns         mutate+74h (00401124)
0040111F   dec         eax
00401120   or          eax,0FEh
00401123   inc         eax
00401124   cmp         eax,1
00401127   jne         mutate+8Ah (0040113a)
21:               input_weights = input_weights * (1 + coefficient);
00401129   fld         qword ptr [__real@8@3fff8000000000000000 (00432030)]
0040112F   fadd        qword ptr [ebp+10h]
00401132   fmul        qword ptr [ebp-10h]
00401135   fstp        qword ptr [ebp-10h]
22:           else
00401138   jmp         mutate+99h (00401149)
23:               input_weights = input_weights * (1 - coefficient);
0040113A   fld         qword ptr [__real@8@3fff8000000000000000 (00432030)]
00401140   fsub        qword ptr [ebp+10h]
00401143   fmul        qword ptr [ebp-10h]
00401146   fstp        qword ptr [ebp-10h]
24:       }
25:       else
00401149   jmp         mutate+0A9h (00401159)
26:           chance = 1.0;
0040114B   mov         dword ptr [ebp-8],0
00401152   mov         dword ptr [ebp-4],3FF00000h
27:       return 0;
00401159   xor         eax,eax
28:   }
0040115B   pop         edi
0040115C   pop         esi
0040115D   pop         ebx
0040115E   add         esp,58h
00401161   cmp         ebp,esp
00401163   call        __chkesp (00408360)
00401168   mov         esp,ebp
0040116A   pop         ebp
0040116B   ret
C++
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
#include <iostream>
using namespace std;
 
int mutate(double propability, double coefficient) ;
 
int main()
{
    double coef = rand() * 1.0/RAND_MAX;
    int mutation= mutate(2, 2);
    return 0;
}
 
int mutate(double propability, double coefficient) 
{
    double chance = rand() * 1.0 / RAND_MAX;
    double input_weights = 5;
    if(chance - propability) 
    {
        int mut_weight = rand() % 5;
        if(rand() % 2 == 1)
            input_weights = input_weights * (1 + coefficient);
        else
            input_weights = input_weights * (1 - coefficient);
    }
    else
        chance = 1.0;
    return 0;
}
Цитата Сообщение от Altaire Посмотреть сообщение
В предыдущем - достаточный листинг.
Какой вам еще нужен? Весь - 2500 строчек, 1500 из которых - мои.
- ну вот в них где то в них и ищи свой баг + я нигде не услышал какой компилятор использован...

Altaire, приведи нормальный(подразумевает ПОЛНЫЙ) код функции
Цитата Сообщение от Altaire Посмотреть сообщение
int Neuron::mutate(double propability, double coefficient)
Думается мне что вот здесь
Цитата Сообщение от Altaire Посмотреть сообщение
double chance = rand() * 1.0 / RAND_MAX;
стоит не 1.0 а 1 потому и идёт работа с целыми, которую доблестно разобрал ValeryS, на пост выше. Как и говоил чуть раньше - выкидывания 1.0 на студийном компиляторе я не увидел, собственно отработки говорят об этом же. Остаётся грешить на компилятор либо на вот такую
rand() * 1 / RAND_MAX
вот запись

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от Altaire Посмотреть сообщение
61: * * if(chance <= propability) {
00000000 *push * * * *ebp
00000001 *mov * * * * ebp,esp
00000003 *sub * * * * esp,38h
- почему тут 61, где ещё 61 строка кода?

0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
08.02.2013, 23:34
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
что и где в этом коде выкинуто
В этом ничего
но смотря на этот кусок
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
004010B9 lea edi,[ebp-58h]
004010BC mov ecx,16h
004010C1 mov eax,0CCCCCCCCh
004010C6 rep stos dword ptr [edi]
я подозреваю что это debug листинг
заполнение стековых переменных константой характерно для debug

вот кусок листинга ТС


Цитата Сообщение от Altaire Посмотреть сообщение
00000049 call FC508254
0000004e mov dword ptr [ebp-30h],eax
00000051 fild dword ptr [ebp-30h]
00000054 fdiv dword ptr ds:[04661CE0h]
0000005a fld qword ptr [ebp+10h]
0000005d fcomip st,st(1)
0000005f fstp st(0)
00000061 jp 00000185
00000067 jb 00000185
видишь никакого умножения
оно нужно было только для того чтобы заставить работать сопроцессор (приведение к double)
здесь ты прав

а вообще все эти тонкости зависят и от компилятора и от режима компиляции
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.02.2013, 23:34
Помогаю со студенческими работами здесь

Пропуск строк кода при пошаговом выполнении программы
У меня есть некоторый код: repeat int := h * sum; sum := 0; h := (b - a) / n; for i := 1 to n do ...

Пропуск пустых строк
Подскажите как сделать что бы не добавлялись в список пустые строки string fileName; string line; ...

Пропуск строк при выполнении
Здравствуйте! В моей программе для перевода числа из арабской записи в римскую в следующей процедуре после 10 строки переходит сразу на...

Пропуск чтения пустых строк в файле
Здравствуйте форумчане! Использую read cd &lt; /dev/ttyAMA0 для чтения порта uart. Но устройство подключенное к этому порту выбрасывает...

Пропуск строк при выборке из таблицы
Из таблицы получаю все значения, при дальнейшей обработке есть условие вывода выводить если только name, sequence, summary пустые ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru