数学建模社区-数学中国
标题: 小心==和~=运算符 [打印本页]
作者: 森之张卫东 时间: 2015-9-4 22:38
标题: 小心==和~=运算符
小心==和~=运算符
等于运算符(==)如果两变量值相同将会返回变量值1,如果不同将返回0。
不等运算符(~=)如果两变量值不同则返回1,相则返回0。
用这两个运算符比较两个字符串他是安全的,不会出现错误。但对两个数字数据的比较,将可能产生异想不到的错误。两个理论上相等的数不能有一丝一毫的差别,而在计算机计算的过程中出现了近似的现象,从而可能在判断相等与不相等的过程中产生错误,这种错误叫做round off错误。例如,考虑下面的两个数,两者均应等于0。
a = 0;
b = sin(pi);
因为这两个数在理论上相等的,所以关系式a==b应当返回值1。但在事实上,MATLAB计算所产生的结果的是
>> a = 0;
>> b = sin(pi);
>> a == b
ans =
0
MATLAB报告了a和b不同因为他产生了一个round off错误,在计算中sin(pi)产生了结果1.2246×10-16而不是0。两个理论上相等的值因为roundoff错误而失之发生了细微的差别。
我们可以通过检测两数之间在一定的范围内是不是近似相等,在这个精确范围内可能会产生round off错误。例如测试
>> abs(a - b) < 1.0E-14
ans =
1
将会产生正确的结果,不管在a与b的计算中产不产生的round off错误。
好的编程习惯
在我们检测两数值是否相等时一定要小心,因为round off错误可能会使两个本来应该相等的值不相等了。这时你可以在round off错误的范围内它是不是近似相等。
3.3.3 逻辑运算符
逻辑运算符是联系一个或二个逻辑操作数并能产生一个逻辑结果的运算符。有三个二元运算符:分别为AND,OR和异或运算符,还有一个一元运算符NOT。二元逻辑运算的基本形式
l1 op l2
一元逻辑运算的基本形式为
op l1
l1和l2代表表达式或变量,op代表表3.2中的逻辑运算符。如果l1和l2的逻辑运算关系为true,那么运算将会返回值1,否则将会产生0。
| 表3.2 逻辑运算符 |
| & | 逻辑与 |
| | | 逻辑或 |
| xor | 逻辑与或 |
| ~ | 逻辑非 |
运算的结果总结在真值表3.3中,它向我们展示每一种运算所有可能的结果。如果一个数的值不为0,那么MATLAB将把看作true,如
| 表3.3 逻辑真值表 |
| | | | |
| l1 | | | | | |
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
果它为0,则其为false。所以~5的结果为0,~0的结果为1。
在运算的顺序中,逻辑运算在所有的数学运算和关系运算之后进行。
表达式中的运算顺序如下:
1.所有的数学运算按照前面描述的顺序的进行。
2.从左向右依次进行关系运算
3.执行所有~运算
4.从左向右依次进行&运算
5.从左向右依次进行|运算和数学运算一样,括号能够改变括号的默认顺序。
下面是关于逻辑运算的一些例子。
例3.1
假设下面有三个变量被初始和一些表达式及其运算结果。
value1 = 1
value2 = 0
value3 = -10
| 逻辑表达式 | 结果 |
| (a) ~value1 | 0 |
| (b) value1 | value2 | 1 |
| (c) value1 & value2 | 0 |
| (d) value1 & value2 | value3 | 1 |
| (e) value1 & (value2 | value3) | 1 |
| (f) ~(value1 & value3) | 0 |
因为~运算在其它的逻辑运算之前进行,那么(f)中的括号是必须的。如果去掉括号的话,(f)表达式将等价于(~value1)&value3。
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |