奇怪的BASIC数学公式

5
我喜欢转换旧的BASIC游戏 - 我找到了一个奇怪的公式。目前我在用Pascal编写,但我可以使用任何一种语言编写。在查阅了代码后,我发现这个变量没有被使用,但我仍然想知道BASIC在过去使用了什么样的数学快捷方式。

d1 = 1-((0.23 + random / 10) * (-(d <= 50)))

d1是一个虚拟变量,d表示子深度。

我将它分解成步骤,发现部分(-(d <= 50))导致我的编译失败。

有人能够给出一些解释吗?

1个回答

4

据我所知,-(d <= 50)应该(布尔值转换为整数)在d <= 50的情况下返回-1,在d > 50的情况下返回0。总之,如果d > 50,则乘法的右侧将等于0,因此d1将等于1。您应该使用else或三元结构进行编写(以下是C-like伪代码):

d1 = (d > 50) ? 1 : 1.23 + random / 10;

逐步说明:

d1 = 1-(( 0.23 + random / 10 ) * (-(d <= 50 )))

那么

if ( d <= 50 )
  d1 = 1-(( 0.23 + random / 10 ) * (-TRUE)))
else
  d1 = 1-(( 0.23 + random / 10 ) * (-FALSE)))

那么

if ( d <= 50 )
  d1 = 1-(( 0.23 + random / 10 ) * (-1)))
else
  d1 = 1-(( 0.23 + random / 10 ) * (-0)))

那么。
if ( d <= 50 )
  d1 = 1 - (( 0.23 + random / 10 ) * -1))
else
  d1 = 1 - (( 0.23 + random / 10 ) * 0))

那么。
if ( d <= 50 )
  d1 = 1 - (-( 0.23 + random / 10 ))
else
  d1 = 1 - (0)

那么

if ( d <= 50 )
  d1 = 1 + ( 0.23 + random / 10 );
else
  d1 = 1;

然后,最终
d1 = (d > 50) ? 1 : 1.23 + random / 10;

非常感谢!那很有道理。 - Klyxmaster
完成了,再次感谢-学习新编程方式永远不会太晚呵呵(我对Pascal有特别的喜好)。 - Klyxmaster
作为一个旁注,我强烈不建议在代码中使用这种“Kronecker delta”,因为它不仅会使代码变得晦涩难懂(正如你已经注意到的那样),而且还会降低其速度(在一种情况下需要评估常量表达式,在另一种情况下需要进行额外的浮点乘法)。可悲的是,我曾经在“严肃”的代码(例如LAMMPS项目中的粒子势能计算器)中看到过这种“hack”很多次。 - user719662
这是我正在转换的70年代末80年代初的旧编程 :-) 我完全同意。由于当时的内存限制,像这样的“技巧”编程几乎是必需的。试着用1k或2k的内存编写游戏吧 :-) - Klyxmaster
@Klyxmaster,老实说,如果可以在单个“if”语句中完成而不增加复杂性或内存占用,我只会说这是一种过早的操作,而不是出于必要。 BASIC应用程序通常由初学者编写,而不是专业人士。我已经编写微控制器代码有一段时间了,我使用C ++进行编码-我交叉编译为汇编以检查代码的效率和优化可能性,并且很少有事情比C ++编译器本身更好(我使用GNU,而不是英特尔-请注意,这是“较差”的一个)... - user719662

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接