比尔盖子 博客

Category: Visual Basic

VB6.0中“取消 Pentium(tm) FDIV 安全性检查”是什么意思

最近比尔盖子在用VB6.0编写一个小型程序。在高级编译优化选项中,有一项:“取消 Pentium(tm) FDIV 安全性检查”,这是什么意思呢?在查阅了资料以后,终于明白了,我们就来了解一下吧。

1994年10月,美国弗吉尼亚州Lynchburg College数学系教授Thomas Nicely发现用电脑处理长除法时一直出错。他用一个数字去除以824,633,702,441时,答案一直是错误的。事后才知道,这位教授使用的60-100MHz P5版本奔腾处理器在浮点运算单元有一个问题,原因是英特尔为了加速运算,将整个乘法表烧录在处理器上面,但是2048个乘法数字中,有5个输入错误。在极少数情况下,会导致除法运算的精确度降低甚至出错。这就是后来臭名昭著的Pentium FDIV bug。

因此,为了避免由于处理器bug导致的运算错误,很多编译器都增加了一个编译选项,可以让程序通过间接运算的方法绕过这个FDIV bug,避免在有 FDIV bug的奔腾处理器上运算错误。但是,由于如今几乎已经不可能有人使用这种老奔腾处理器了,因此可以在VB6.0或其它的编译器中(如果有的话),安全的“取消 Pentium(tm) FDIV 安全性检查”,可以轻微提高性能,同时不会导致任何异常。

最后送上十几年前的那个笑话:英特尔有新格言了

United We Stand, Divided We Fall.

注:这句话原出自《伊索寓言》,翻译过来即是

合即立,分即跨。

但是Divided在这里是“除法”的意思。于是就有了翻译过来大概是

加法我们对了,除法我们错了。

用VB6.0实现的简单逻辑判断

其实站长也只是一个编程菜鸟,以前用VB编计算器时还犯过1+1=11的错误。最近重新开始学习VB,写了一个非常简单的逻辑判断程序。这里的主题稍微恶搞了一下,呵呵。

程序截图:

 

我目前使用两种方法来实现同样的效果,请知情人士告诉我哪种方法效率高,我试图用API来统计运行时间,但是时间每次都不固定……

方法1:用If…Then…Elself

Private Sub Command1_Click()
If Check2.Value = 1 And Check1.Value = 1 Then
 MsgBox "我晕!您到底是谁的粉丝啊?!" '暂时的Bug修正大法,以后有更先进的方法!
ElseIf Check1.Value = 1 Then
 MsgBox "你原来是果粉!"
ElseIf Check2.Value = 1 Then
 MsgBox "你原来是谷粉!"
ElseIf Check2.Value = 1 And Check1.Value = 1 Then
MsgBox "你原来是谷粉!"
Else
 MsgBox "我晕!您到底是谁的粉丝啊?!"
End If
End Sub

方法2:用Case

Private Sub Command1_Click()
fans = (Check1.Value + 10) + (Check2.Value / 20)
'为了使用Case判断,我这里使用了数学方法。这样,如果Check1为True,那么fans就等于11;如果Check2为True,那么fans就等于10.05;如果Check1、Check2为True或都为False,那么fans就等于11.05和10。如果你有更好的方法,欢迎提出更好的建议!
Select Case fans
Case 11
 MsgBox "你原来是果粉!"
Case 10.05
 MsgBox "你原来是谷粉!"
Case 11.05, 10
 MsgBox "我晕!您到底是谁的粉丝啊?!"
End Select
End Sub

Copyright © 2023 比尔盖子 博客

Theme by Anders NorenUp ↑