IDL程序中gt与>替换后运行结果不同的原因咨询
IDL中
gt与>比较运算符结果差异的原因 在你的IDL程序中,将倒数第8行的gt替换为>后结果出现差异,核心原因是IDL对这两个运算符的定义完全不同:
gt是数值比较运算符:专门针对数值类型执行数学意义上的大小比较,直接对比两个数的数值大小。>是字符串比较运算符:即使传入的是数值,也会先将其转换为字符串,再按照ASCII字符的顺序进行比较。
具体差异示例
比如比较数值1000和999:
- 用
gt时:1000 gt 999→ 数学上1000更大,结果为真。 - 用
>时:会先转为字符串"1000"和"999",按ASCII顺序比较第一个字符'1'和'9','1'的ASCII码小于'9',因此"1000" > "999"结果为假。
对程序的影响
你的程序中final_month_plants和max_final_month_plants都是长整型数值,当两者位数不同(比如一个是4位数、一个是3位数)时,用>进行字符串比较的结果会和数值比较的gt完全相反,导致IF条件判断逻辑错误:原本应该更新最优策略和最大值的情况被跳过,或者不该更新的情况被执行,最终导致输出的最优策略和最大母本数量与原程序不同。
原程序代码
FUNCTION plant_growth, n_months, initial_plants, pick_strategy N = LONARR(n_months + 1) M = LONARR(n_months + 1) N[0] = initial_plants M[0] = 0 FOR t=0, n_months-1 DO BEGIN IF t ge 2 THEN M[t] = N[t-2] + M[t-1] - pick_strategy[t] N[t+1] = N[t] + M[t] ENDFOR RETURN, N END PRO monte_carlo_simulation, n_months, initial_plants n_months = 8 initial_plants = 1000 n_simulations = 27933 seed = 0L best_strategy = LONARR(n_months) max_final_month_plants = 0 FOR i=0, n_simulations-1 DO BEGIN pick_strategy = LONARR(n_months) FOR j=0, n_months-1 DO BEGIN pick_strategy[j] = FLOOR(RANDOMU(seed)*initial_plants) ENDFOR N = plant_growth(n_months, initial_plants, pick_strategy) final_month_plants = N[n_months] IF final_month_plants gt max_final_month_plants THEN BEGIN best_strategy = pick_strategy max_final_month_plants = final_month_plants ENDIF ENDFOR PRINT, '最优策略是:', best_strategy PRINT, '最后一月的最大母本数量是:', max_final_month_plants END
内容的提问来源于stack exchange,提问作者Huang Jeff
相关产品推荐
相关产品推荐

