精华内容
下载资源
问答
  • 运算

    2016-10-12 17:06:00
    Python语言支持操作者以下几种类型。 3 算术运算符 4 比较(即关系)运算符 5 赋值运算符 6 逻辑运算符 7 位运算符 8 会员操作符 9 标识操作符 10 让我们逐一看看所有的运算符。 11 Python算术...
      1 什么是操作符?
      2 简单的回答可以使用表达式4 + 5等于9,在这里4和5被称为操作数,+被称为操符。 Python语言支持操作者有以下几种类型。
      3 算术运算符
      4 比较(即关系)运算符
      5 赋值运算符
      6 逻辑运算符
      7 位运算符
      8 会员操作符
      9 标识操作符
     10 让我们逐一看看所有的运算符。
     11 Python算术运算符:
     12 假设变量a持有10和变量b持有20,则: 
     13 ​操作符    描述符 例子
     14 +   加法 - 对操作符的两侧增加值 a + b = 30
     15 -   减法 - 减去从左侧操作数右侧操作数  a - b = -10
     16 *   乘法 - 相乘的运算符两侧的值 a * b = 200
     17 /   除 - 由右侧操作数除以左侧操作数   b / a = 2
     18 %   模 - 由右侧操作数和余返回除以左侧操作数   b % a = 0
     19 **  指数- 执行对操作指数(幂)的计算   a**b = 10 的幂 20
     20 //  地板除 - 操作数的除法,其中结果是将小数点后的位数被除去的商。    9//2 =  4 而 9.0//2.0 = 4.0
     21 #!/usr/bin/pythona = 21b = 10c = 0c = a + bprint "Line 1 - Value of c is ", c
     22 
     23 c = a - bprint "Line 2 - Value of c is ", c 
     24 
     25 c = a * bprint "Line 3 - Value of c is ", c 
     26 
     27 c = a / bprint "Line 4 - Value of c is ", c 
     28 
     29 c = a % bprint "Line 5 - Value of c is ", c
     30 
     31 a = 2b = 3c = a**b 
     32 print "Line 6 - Value of c is ", c
     33 
     34 a = 10b = 5c = a//b print "Line 7 - Value of c is ", c
     35 
     36 执行程序结果
     37 Line 1 - Value of c is 31
     38 Line 2 - Value of c is 11
     39 Line 3 - Value of c is 210
     40 Line 4 - Value of c is 2
     41 Line 5 - Value of c is 1
     42 Line 6 - Value of c is 8
     43 Line 7 - Value of c is 2
     44 Python的比较操作符:
     45 假设变量a持有10和变量b持有20,则:
     46 运算符 描述  示例
     47 ==  检查,两个操作数的值是否相等,如果是则条件变为真。   (a == b) 不为 true.
     48 !=  检查两个操作数的值是否相等,如果值不相等,则条件变为真。    (a != b) 为 true.
     49 <>  检查两个操作数的值是否相等,如果值不相等,则条件变为真。    (a <> b) 为 true。这个类似于 != 运算符
     50 >   检查左操作数的值是否大于右操作数的值,如果是,则条件成立。   (a > b) 不为 true.
     51 <   检查左操作数的值是否小于右操作数的值,如果是,则条件成立。   (a < b) 为 true.
     52 >=  检查左操作数的值是否大于或等于右操作数的值,如果是,则条件成立。    (a >= b) 不为 true.
     53 <=  检查左操作数的值是否小于或等于右操作数的值,如果是,则条件成立。    (a <= b) 为 true.
     54 #!/usr/bin/pythona = 21b = 10c = 0if ( a == b ):
     55    print "Line 1 - a is equal to b"else:
     56    print "Line 1 - a is not equal to b"if ( a != b ):
     57    print "Line 2 - a is not equal to b"else:
     58    print "Line 2 - a is equal to b"if ( a <> b ):
     59    print "Line 3 - a is not equal to b"else:
     60    print "Line 3 - a is equal to b"if ( a < b ):
     61    print "Line 4 - a is less than b" else:
     62    print "Line 4 - a is not less than b"if ( a > b ):
     63    print "Line 5 - a is greater than b"else:
     64    print "Line 5 - a is not greater than b"a = 5;b = 20;if ( a <= b ):
     65    print "Line 6 - a is either less than or equal to  b"else:
     66    print "Line 6 - a is neither less than nor equal to  b"if ( b >= a ):
     67    print "Line 7 - b is either greater than  or equal to b"else:
     68    print "Line 7 - b is neither greater than  nor equal to b"
     69 当执行上面的程序它会产生以下结果:
     70 
     71 Line 1 - a is not equal to b
     72 Line 2 - a is not equal to b
     73 Line 3 - a is not equal to b
     74 Line 4 - a is not less than b
     75 Line 5 - a is greater than b
     76 Line 6 - a is either less than or equal to b
     77 Line 7 - b is either greater than or equal to b
     78 Python赋值运算符:
     79 假设变量持有10和变量b持有20,则:
     80 运算符 描述  示例
     81 =   简单的赋值运算符,赋值从右侧操作数左侧操作数  c = a + b将指定的值 a + b 到  c
     82 +=  加法AND赋值操作符,它增加了右操作数左操作数和结果赋给左操作数    c += a 相当于 c = c + a
     83 -=  减AND赋值操作符,它减去右边的操作数从左边操作数,并将结果赋给左操作数    c -= a 相当于 c = c - a
     84 *=  乘法AND赋值操作符,它乘以右边的操作数与左操作数,并将结果赋给左操作数    c *= a 相当于 c = c * a
     85 /=  除法AND赋值操作符,它把左操作数与正确的操作数,并将结果赋给左操作数 c /= a 相当于= c / a
     86 %=  模量AND赋值操作符,它需要使用两个操作数的模量和分配结果左操作数   c %= a is equivalent to c = c % a
     87 **= 指数AND赋值运算符,执行指数(功率)计算操作符和赋值给左操作数    c **= a 相当于 c = c ** a
     88 //= 地板除,并分配一个值,执行地板除对操作和赋值给左操作数 c //= a 相当于 c = c // a
     89 #!/usr/bin/pythona = 21b = 10c = 0c = a + bprint "Line 1 - Value of c is ", c
     90 
     91 c += aprint "Line 2 - Value of c is ", c 
     92 
     93 c *= aprint "Line 3 - Value of c is ", c 
     94 
     95 c /= a 
     96 print "Line 4 - Value of c is ", c 
     97 
     98 c  = 2c %= aprint "Line 5 - Value of c is ", c
     99 
    100 c **= aprint "Line 6 - Value of c is ", c
    101 
    102 c //= aprint "Line 7 - Value of c is ", c
    103 当执行上面的程序,它会产生以下结果:
    104 
    105 Line 1 - Value of c is 31
    106 Line 2 - Value of c is 52
    107 Line 3 - Value of c is 1092
    108 Line 4 - Value of c is 52
    109 Line 5 - Value of c is 2
    110 Line 6 - Value of c is 2097152
    111 Line 7 - Value of c is 99864
    112 Python位运算符:
    113 位运算符作用于位和位操作执行位。假设,如果a =60;且b =13;现在以二进制格式它们将如下:
    114 a = 0011 1100
    115 b = 0000 1101
    116 -----------------
    117 a&b = 0000 1100
    118 a|b = 0011 1101
    119 a^b = 0011 0001
    120 ~a  = 1100 0011
    121 Python语言支持下位运算符
    122 操作符 描述  示例
    123 &   二进制和复制操作了一下,结果,如果它存在于两个操作数。 (a & b) = 12 即 0000 1100
    124 |   二进制或复制操作了一个比特,如果它存在一个操作数中。  (a | b) = 61 即 0011 1101
    125 ^   二进制异或运算符的副本,如果它被设置在一个操作数而不是两个比特。    (a ^ b) =  49 即  0011 0001
    126 ~   二进制的补运算符是一元的,并有“翻转”位的效果。    (~a ) =  -61 即 1100 0011以2的补码形式由于带符号二进制数。
    127 <<  二进位向左移位运算符。左操作数的值左移由右操作数指定的位数。  a << 2 = 240 即 1111 0000
    128 >>  二进位向右移位运算符。左操作数的值是由右操作数指定的位数向右移动。   a >> 2 = 15 即 0000 1111
    129 #!/usr/bin/pythona = 60            # 60 = 0011 1100 b = 13            # 13 = 0000 1101 c = 0c = a & b;        # 12 = 0000 1100print "Line 1 - Value of c is ", c
    130 
    131 c = a | b;        # 61 = 0011 1101 print "Line 2 - Value of c is ", c
    132 
    133 c = a ^ b;        # 49 = 0011 0001print "Line 3 - Value of c is ", c
    134 
    135 c = ~a;           # -61 = 1100 0011print "Line 4 - Value of c is ", c
    136 
    137 c = a << 2;       # 240 = 1111 0000print "Line 5 - Value of c is ", c
    138 
    139 c = a >> 2;       # 15 = 0000 1111print "Line 6 - Value of c is ", c
    140 当执行上面的程序它会产生以下结果:
    141 
    142 Line 1 - Value of c is 12
    143 Line 2 - Value of c is 61
    144 Line 3 - Value of c is 49
    145 Line 4 - Value of c is -61
    146 Line 5 - Value of c is 240
    147 Line 6 - Value of c is 15
    148 Python逻辑运算符:
    149 Python语言支持以下逻辑运算符。假设变量a持有10和变量b持有20则:
    150 运算符 描述  示例
    151 and 所谓逻辑与运算符。如果两个操作数都是真的,那么则条件成立。   (a and b) 为 true.
    152 or  所谓逻辑OR运算符。如果有两个操作数都是非零然后再条件变为真。 (a or b) 为 true.
    153 not 所谓逻辑非运算符。用于反转操作数的逻辑状态。如果一个条件为真,则逻辑非运算符将返回false。 not(a and b) 为 false.
    154 #!/usr/bin/pythona = 10b = 20c = 0if ( a and b ):
    155    print "Line 1 - a and b are true"else:
    156    print "Line 1 - Either a is not true or b is not true"if ( a or b ):
    157    print "Line 2 - Either a is true or b is true or both are true"else:
    158    print "Line 2 - Neither a is true nor b is true"a = 0if ( a and b ):
    159    print "Line 3 - a and b are true"else:
    160    print "Line 3 - Either a is not true or b is not true"if ( a or b ):
    161    print "Line 4 - Either a is true or b is true or both are true"else:
    162    print "Line 4 - Neither a is true nor b is true"if not( a and b ):
    163    print "Line 5 - Either a is not true or b is not true"else:
    164    print "Line 5 - a and b are true"
    165 当执行上面的程序它会产生以下结果:
    166 
    167 Line 1 - a and b are true
    168 Line 2 - Either a is true or b is true or both are true
    169 Line 3 - Either a is not true or b is not true
    170 Line 4 - Either a is true or b is true or both are true
    171 Line 5 - Either a is not true or b is not true
    172 Python成员运算符:
    173 除了前面讨论的运算符,Python成员运算符,在一个序列中成员资格的测试,如字符串,列表或元组。有两个成员运算符解释如下:
    174 操作符 描述  示例
    175 in  计算结果为true,如果它在指定找到变量的顺序,否则false。    x在y中,在这里产生一个1,如果x是序列y的成员。
    176 not in  计算结果为true,如果它不找到在指定的变量顺序,否则为false。  x不在y中,这里产生结果不为1,如果x不是序列y的成员。
    177 #!/usr/bin/pythona = 10b = 20list = [1, 2, 3, 4, 5 ];if ( a in list ):
    178    print "Line 1 - a is available in the given list"else:
    179    print "Line 1 - a is not available in the given list"if ( b not in list ):
    180    print "Line 2 - b is not available in the given list"else:
    181    print "Line 2 - b is available in the given list"a = 2if ( a in list ):
    182    print "Line 3 - a is available in the given list"else:
    183    print "Line 3 - a is not available in the given list"
    184 当执行上面的程序它会产生以下结果:
    185 
    186 Line 1 - a is not available in the given list
    187 Line 2 - b is not available in the given list
    188 Line 3 - a is available in the given list
    189 Python标识运算符:
    190 标识符比较两个对象的内存位置。两个运算符标识解释如下:
    191 运算符 描述  例子
    192 is  计算结果为true,如果操作符两侧的变量指向相同的对象,否则为false。   x是y,这里结果是1,如果id(x)的值为id(y)。
    193 is not  计算结果为false,如果两侧的变量操作符指向相同的对象,否则为true。   x不为y,这里结果不是1,当id(x)不等于id(y)。
    194 #!/usr/bin/pythona = 20b = 20if ( a is b ):
    195    print "Line 1 - a and b have same identity"else:
    196    print "Line 1 - a and b do not have same identity"if ( id(a) == id(b) ):
    197    print "Line 2 - a and b have same identity"else:
    198    print "Line 2 - a and b do not have same identity"b = 30if ( a is b ):
    199    print "Line 3 - a and b have same identity"else:
    200    print "Line 3 - a and b do not have same identity"if ( a is not b ):
    201    print "Line 4 - a and b do not have same identity"else:
    202    print "Line 4 - a and b have same identity"
    203 当执行上面的程序它会产生以下结果:
    204 
    205 Line 1 - a and b have same identity
    206 Line 2 - a and b have same identity
    207 Line 3 - a and b do not have same identity
    208 Line 4 - a and b do not have same identity
    209 Python运算符优先级
    210 下表列出了所有运算符从最高优先级到最低。
    211 
    212 运算符 描述
    213 **  幂(提高到指数)
    214 ~ + -   补码,一元加号和减号(方法名的最后两个+@和 - @)
    215 * / % //    乘,除,取模和地板除
    216 + - 加法和减法
    217 >> <<   左,右按位转移
    218 &   位'AND'
    219 ^ | 按位异'或`'和定期`或'
    220 <= < > >=   比较运算符
    221 <> == !=    等式运算符
    222 = %= /= //= -= += *= **=    赋值运算符
    223 is is not   标识运算符
    224 in not in   成员运算符
    225 not or and  逻辑运算符
    226 #!/usr/bin/pythona = 20b = 10c = 15d = 5e = 0e = (a + b) * c / d       #( 30 * 15 ) / 5print "Value of (a + b) * c / d is ",  e
    227 
    228 e = ((a + b) * c) / d     # (30 * 15 ) / 5print "Value of ((a + b) * c) / d is ",  e
    229 
    230 e = (a + b) * (c / d);    # (30) * (15/5)print "Value of (a + b) * (c / d) is ",  e
    231 
    232 e = a + (b * c) / d;      #  20 + (150/5)print "Value of a + (b * c) / d is ",  e
    233 当执行上面的程序,它会产生以下结果:
    234 
    235 Value of (a + b) * c / d is 90
    236 Value of ((a + b) * c) / d is 90
    237 Value of (a + b) * (c / d) is 90
    238 Value of a + (b * c) / d is 50

     

    转载于:https://www.cnblogs.com/liangml/p/5953628.html

    展开全文
  • 【多选题】关于铸造牙合支托的支托凹的制备...【多选题】可摘局部义齿的不稳定表现以下四情况,包括( )。【多选题】RPI卡环由以下个部分组成( )。【多选题】根据题意判断下列说法正确的是【多选题】RPI卡环的优...

    【多选题】关于铸造牙合支托的支托凹的制备,下列说法正确的是( )。

    【多选题】常用的倒凹深度有( )。

    【单选题】三氟化氮是三角锥形,则氮的杂化轨道类型是

    【多选题】下列关于修复前余留牙的处理,正确的是( )。

    【多选题】可摘局部义齿的不稳定表现有以下四种情况,包括( )。

    【多选题】RPI卡环由以下几个部分组成( )。

    【多选题】根据题意判断下列说法正确的是

    【多选题】RPI卡环的优点是( )。

    【多选题】共同就位道与模型倾斜方向的关系是( )。

    【单选题】在管理的职能中,对组织未来活动进行的预先筹划和安排是 ( )

    【多选题】可摘局部义齿基托具有下列哪些功能( )。

    【多选题】

    【多选题】下列哪种情况下不宜设计I杆( )。

    【多选题】与固定义齿比较,可摘局部义齿具有下列哪些优点( )。

    【多选题】CN-为强场配体,F-为弱场配体,据此判断上述两种配合物的杂化类型。

    【单选题】I think that more obvious is the increasing influence of the advertisement on TV or newspaper on the ordinary life of mankind.

    【多选题】下列哪些部位可以设计牙合支托( )。

    【阅读理解】Task 2 CHICAGO(AP) Sunday was expected to be the heaviest travel day since Jan. 1, when a congressional order went into effect requiring that every checked bag at more than 400 of the nation’s commercial airports be screened for explosives. Spot checks Sunday at several of the nation’s airport showed no major delays caused by the new security measures. At the international terminal for Northwest Airlines at John F. Kennedy International Airport in New York, passengers waited up to 3- minutes longer than usual while their bags were sent through giant screening machines and workers tore open taped boxes and searched through their contents before closing them up again. Most travelers simply accepted the intensified screening, developed since the terrorist attacks on Sept. 11, 2001, before which only 5 percent of the roughly 2 million bags checked each day were screened for bombs. The federal government put an additional 23000 screeners into airports to carry out the new order. Sonny Salgatar, a 23-year-old college student flying home to San Diego from O’Hare, was told by a screener after the first pass that one of his bags was “hot”, meaning there was something he couldn’t identify and he wanted to open the bag for an inspection. The “hot” item turned out to be Salgatar’s clothing iron. “Listen, anything they want to do for security is Ok with me.”Salgatar said.

    【多选题】患者下颌8765 8缺失,设计可摘局部义齿,选择双侧下颌4做基牙,设计右下4-三臂卡,左下4间隙卡,义齿可能出现的不稳定现象是( )。

    【单选题】上述化合物中键的极性最小的化合物是?

    【多选题】下列哪些材料是不可逆印模材料( )。

    【单选题】甲烷的键角为

    【多选题】可摘局部义齿的组成部分包括( )。

    【阅读理解】Task 1 In 99 cases out of a 100 insomnia are caused by a disturbance of the natural sleep rhythm. The reasons why the rhythm has been disturbed are many and they range from drugs that are being taken to treat a separate medical condition to anxiety. A sudden change in lifestyle or climate could do it, or just that you’ve fallen into the habit of dozing off in front of the television. Certainly the body must have enough sleep. Tests that deprived people of sleep have proved lack of it can cause fairly rapid physical and mental deterioration. But on the other hand, it doesn’t need too much. So if you’re sleeping in front of the TV, you won’t sleep soundly at night. Similarly, if you’re holidaying in Spain , and spending your days sleeping on the beach, chances are that you’ll be wide awake at bedtime. Of course, the problem for my summer insomniacs is that, despite an almost overwhelming urge to put their heads down on their desks in the afternoon, they aren’t getting any extra sleep to compensate for their wakeful nights. For the worst sufferers I sometimes prescribe a mild sleeping pill which, after a few nights, reestablishes the body’s natural sleep rhythm, conditioning it to accept the heat.

    【单选题】PH3分子的几何构型是

    【多选题】可摘局部义齿修复中,选择人工前牙需要考虑的因素有( )。

    【单选题】He started his trip to some of the cities in Northwestern China, which he had planned for a long time.

    【单选题】Your knowledge has made a favorable impression on people around you, which in fact is part of your good public relations.

    【单选题】上述化合物中键的极性最大的是?

    【多选题】已知CN为强场配体,F为弱场配体,则下述描述正确的是

    【多选题】研究模型的作用有( )。

    【多选题】下列分子的键角前者大于后者的是

    【单选题】水分子中HOH夹角为

    【多选题】与卡环臂固位力大小有关的因素包括( )。

    【多选题】RPI卡环可以减轻对基牙扭力的原因有( )。

    【多选题】Kennedy分类法中有亚类的是( )

    【阅读理解】The potato was widely thought to be fattening. The Potato Board, a non-profit organization representing 18000 potato growers, hired Ketchum Public Relations recently to correct the misunderstanding and to convince people that the potato is nutritious and can be eaten without causing weight gain. Good Housekeeping and Readers’ Digest published articles praising the food value of potatoes. These articles were arranged through personal contact with the editors. A food expert, Barbara Gibbons, was authorized by Ketchum to write The Potato Lover’s Diet Cookbook. To bring the book to public notice, she made television and radio appearances nationwide. Nearly a half million requests for the book were filled by the Potato Board. To reach the youth audience, Ketchum prepared an educational program for high schools, where young people generally become weight-conscious. A survey taken before the program began showed that 35 percent of consumers believed potatoes were too fattening. In a follow-up survey two years later, 25 percent thought potatoes were too fattening—a striking change in attitude. Four years later, a slightly different survey showed that 73 percent believed that potatoes contain no fat. Over the 6-year period, consumption of potatoes rose 4 percent.

    【单选题】Many people in Germany show great interest in “Home for Help”, where students in need of cheap rooms move in with seniors looking for company and help.

    【单选题】SiH4分子的几何构型是

    【多选题】下列方法可以作为应力中断设计的是( )。

    【阅读理解】Task 1 Most airlines allow passengers to book an airline flight online. Travel sites such as Yahoo and Google, all offer search engines and online booking for an airline flight. The first thing a traveler should do when booking online is to shop around. There are numerous Web sites offering this service, and some may have cheaper fares than others. A traveler also needs to check fares for the desired flight times. Fares can change, depending on when the airline flight departs, how many stops are involved, and at what airport. The traveler needs to make sure he is comparing fares so as to get the best deal. When booking online, the traveler also needs to check the travel site’s policies and fees. Most travel sites charge a small booking fee and have other restrictions about canceling flights, and other types of refunds. Many travelers think about looking on a travel search engine first for the best airline flight fares. However, the individual airline Web site may offer the best deal, since they often have “Internet only” deals booked through their own sites. A traveler should always have a credit card available when he or she purchases the ticket, and should make the reservation in the name appearing on the card. The traveler will then be issued an e-ticket for the airline flight, rather than the traditional paper ticket. When he receives flight confirmation, usually through email, he should print out the reservation email and save it with his travel documents.

    【单选题】氨气分子的键角为

    【多选题】设计可摘局部义齿时,对口腔软硬组织有保护性的措施是( )。

    【多选题】通过调整义齿就位道的方向,可以增减固位作用。因为改变就位道可以( ).

    【多选题】X线检查能了解的信息有( )。

    【单选题】三氟化硼是平面三角形,其杂化轨道类型是

    【多选题】I型杆的优点有( )。

    【多选题】通过下列哪些方式可以调节义齿的固位力( )。

    【多选题】属于Kennedy第二类第一亚类的是( )。

    【多选题】可摘局部义齿基托组织面在下列哪些解剖位置需要做缓冲( )。

    展开全文
  • 快速浮点开方运算

    万次阅读 多人点赞 2017-12-19 10:35:16
    代码下载:开根号的几种算法实现 在之前的博客中我们介绍了数据类型的地址转换,利用它我们可以将一个float型的值直接看成一个int类型。这种地址转换到底什么意义,或者说什么用途呢?今天,给大家展示一个...

    代码下载:开根号的几种算法实现
    在之前的博客中我们介绍了数据类型的地址转换,利用它我们可以将一个float型的值直接看成一个int类型。这种地址转换到底有什么意义,或者说有什么用途呢?今天,给大家展示一个实例—快速浮点开方运算,让大家更加明白地址转换的含义和它们之间的对应关系。

    1 二分法

    浮点开方也就是给定一个浮点数x,求x\sqrt x。这个简单的问题有很多解,我们从最简单最容易想到的二分开始讲起。利用二分进行开平方的思想很简单,就是假定中值为最终解。假定下限为0,上限为x,然后求中值;然后比较中值的平方和x的大小,并根据大小修改下限或者上限;重新计算中值,开始新的循环,直到前后两次中值的距离小于给定的精度为止。**需要注意的一点是,如果x小于1,我们需要将上限置为1,原因你懂的。**代码如下:

    float SqrtByBisection(float n)
    {
    	float low,up,mid,last; 
    	low=0,up=(n<1?1:n); 
    	mid=(low+up)/2; 
    	do
    	{
    		if(mid*mid>n)
    			up=mid; 
    		else 
    			low=mid;
    		last=mid;
    		mid=(up+low)/2; 
    	}while(fabsf(mid-last) > eps);
    
    	return mid; 
    }
    

    这种方法非常直观,也是面试过程中经常会问到的问题,不过这里有一点需要特别注意:在精度判别时不能利用上下限而要利用前后两次mid值,否则可能会陷入死循环!这是因为由于精度问题,在循环过程中可能会产生mid值和up或low中的一个相同。这种情况下,后面的计算都不会再改变mid值,因而在达不到精度内时就陷入死循环。但是改为判断前后两次mid值就不会有任何问题(为啥自己想)。大家可以找一些例子试一下,这可以算是二分法中的一个trick。二分虽然简单,但是却有一个非常大的问题:收敛太慢!也即需要循环很多次才能达到精度要求。这也比较容易理解,因为往往需要迭代3到4次才能获得一位准确结果。为了能提升收敛速度,我们需要采用其它的方法。

    2 牛顿迭代法

    原理也比较简单,就是将中值替换为切线方程的零根作为最终解。原理可以利用下图解释(from matrix67):
    这里写图片描述
    图一 牛顿迭代法求开方
    假设现在要求a\small \sqrt{a}的值(图中a=2),我们将其等价转化为求函数y=x2a\small \small y=x^{2}-a与x轴大于0的交点。为了获得该交点的值,我们先假设一个初始值,在图一中为x0=4\small \small x_{0}=4。过x=x0\small \small x=x_{0}的直线与y=x22\small \small y=x^{2}-2交于一点(x0,y0)\small \small \left ( x_{0},y_{0} \right ),过该点做切线交x轴于x1\small \small x_{1},则x1\small \small x_{1}是比x0\small x_{0}好的一个结果。重复上述步骤,过x=x1\small \small x=x_{1}直线与y=x22\small \small y=x^{2}-2交于一点(x1,y1)\small \small \left (x_{1},y_{1} \right ),过该点做切线交x轴于x2\small \small x_{2},则x2\small \small x_{2}是比x1\small \small x_{1}更好的一个结果……
    很明显可以看出该方法斜着逼近目标值,收敛速度应该快于二分法。但是如何由x0\small x_{0}获得x1\small \small x_{1}呢,我们需要获得一个递推公式。看图中的阴影三角形,竖边的长度为y0\small \small y_{0},如果我们能求得横边的长度l,则很容易得到x1=x0l\small \small x_{1}=x_{0}-l。因为三角形的斜边其实是过(x0,y0)\small \small \left ( x_{0},y_{0} \right )的切线,所以我们可以很容易知道该切线的斜率为f(x0)\small \small {f}&#x27;(x_{0}),然后利用正切的定义就可以获得l的长度为y0f(x0)\small \small \frac{y_{0}}{{f}&#x27;(x_{0})},由此我们得到递推公式为:
    xi=xi1y0f(x0)=xi1xi12a2xi1=12(xi1+axi1)\small \small x_{i}=x_{i-1}-\frac{y_{0}}{{f}&#x27;(x_{0})}=x_{i-1}-\frac{x_{i-1}^{2}-a}{2*x_{i-1}}=\frac{1}{2}\left ( x_{i-1}+\frac{a}{x_{i-1}} \right )
    后面我们需要做的就是利用上面的公式去迭代,直到达到精度要求,代码如下:

    float SqrtByNewton(float x)
    {
    	float val=x;//初始值
    	float last;
    	do
    	{
    		last = val;
    		val =(val + x/val) / 2;
    	}while(fabsf(val-last) > eps);
    	return val;
    }
    

    对上述代码进行测试,结果确实比二分法快,对前300万的所有整数进行开方的时间分别为1600毫秒和1000毫秒,快的原因主要是迭代次数比二分法更少。虽然牛顿迭代更快,但是还有进一步优化的余地:首先牛顿迭代的代码中有两次除法,而二分法中只有一次,通常除法要比乘法慢个几倍,因而会导致单次迭代速度的下降,如果能消除除法,速度还能提高不少,后面会介绍没有除法的算法;其次我们选择原始值作为初始估值,这其实不是一个好的估计,这就导致需要迭代多次才能达到精度要求。当然二分法也存在这个问题,但是上下限不容易估计,只能采用最保守的方式。而牛顿迭代则可以任意选择初始值,所以就存在选择的问题。
    我们分析一下为什么牛顿迭代法可以任意选择初值(当然必须要大于0)。由公式
    xi=12(xi1+axi1)\small \small x_{i}=\frac{1}{2}\left ( x_{i-1}+\frac{a}{x_{i-1}} \right )
    我们可以得出几个结论:

    • 当i>1时,xia\small \small x_{i}\geq \sqrt{a},这可由均值不等式得到,也即点都在精确值的右侧;
    • 由1推出,x0\small x_{0}可以大于a\small \sqrt{a}也可以小于a\small \sqrt{a},只需要大于0即可,因为一次迭代之后都会变为结论1;

    所以,牛顿迭代存在一个初值选择的问题,选择得好会极大降低迭代的次数,选择得差效率也可能会低于二分法。我们先给出一个采用新初值的代码:

    float SqrtByNewton(float x)
    {
    	int temp = (((*(int *)&x)&0xff7fffff)>>1)+(64<<23);
    	float val=*(float*)&temp;
    	float last;
    	do
    	{
    		last = val;
    		val =(val + x/val) / 2;
    	}while(fabsf(val-last) > eps);
    	return val;
    }
    

    对上述代码重复之前的测试,运行时间由1000毫秒降为240毫秒,性能提升了接近4倍多!为啥改用上面复杂的两句代码就能使速度提升这么多呢?这就需要用到我们之前博客介绍的IEEE浮点数表示。我们知道,IEEE浮点标准用v=(1)s×1.m×2e\small \small v=\left ( -1 \right )^{s}\times 1.m\times 2^{e}的形式来表示一个数,将该数存入float类型之后变为:
    这里写图片描述
    现在需要对这个浮点数进行开方,我们看看各部分都会大致发生什么变化。指数E肯定会除以2,127保持不变,m需要进行开方。由于指数部分是浮点数的大头,所以对指数的修改最容易使初始值接近精确值。幸运的是,对指数的开平方我们只需要除以2即可,也即右移一位。但是由于E+127可能是奇数,右移一位会修改指数,我们将先将指数的最低位清零,这就是& 0xff7fffff的目的。然后将该转换后的整数右移一位,也即将指数除以2,同时尾数也除以2(其实只是尾数的小数部分除以2)。由于右移也会将127除以2,所以我们还需要补偿一个64,这就是最后还需要加一个(64<<23)的原因。
    这里大家可能会有疑问,最后为什么加(64<<23)而不是(63<<23),还有能不能不将指数最后一位清零?答案是都可以,但是速度都没有我上面写的快。这说明我上面的估计更接近精确值。下面简单分析一下原因。首先假设e为偶数,不妨设e=2n,开方之后e则应该变为n,127保持不变,我们看看上述代码会变为啥。e+127是奇数,会清零,这等价于e+126,右移一位变为n+63,加上补偿的64,指数为n+127,正是所需!再假设e为奇数,不妨设e=2n+1,开方之后e应该变为n+1(不精确),127保持不变,我们看看上述代码会变为啥。e+127是偶数等于2n+128,右移一位变为n+64,加上补偿的64,指数为n+1+127,也是所需!这确实说明上述的估计比其他方法更精确一些,因而速度也更快一些。
    虽然优化之后的牛顿迭代算法比二分快了很多,但是速度都还是低于库函数sqrtf,同样的测试sqrtf只需要100毫秒,性能是优化之后牛顿迭代算法的3倍!库函数到底是如何实现的!这说明我们估计的初始值还不是那么精确。不要着急,我们下面介绍一种比库函数还要快的算法,其性能又是库函数的10倍!

    3卡马克算法

    这个算法是99年被人从一个游戏源码中扒出来的,作者号称是游戏界的大神卡马克,但是追根溯源,貌似这个算法存在的还要更久远,原始作者已不可考,暂且称为卡马克算法。啥都不说,先上代码一睹为快:

    float SqrtByCarmack( float number )
    {
    	int i;
    	float x2, y;
    	const float threehalfs = 1.5F;
    
    	x2 = number * 0.5F;
    	y  = number;
    	i  = * ( int * ) &y;     
    	i  = 0x5f375a86 - ( i >> 1 ); 
    	y  = * ( float * ) &i;
    	y  = y * ( threehalfs - ( x2 * y * y ) ); 
    	y  = y * ( threehalfs - ( x2 * y * y ) );  	
    	y  = y * ( threehalfs - ( x2 * y * y ) ); 
    	return number*y;
    }
    

    扫一眼上面的代码会有两个直观的感觉:这代码居然没有循环!这代码居然没有除法!第一眼见到该代码的人都会被震撼!下面对该算法进行解释,要解释需要看最原始的版本:

    float Q_rsqrt( float number )
    {
    	long i;
    	float x2, y;
    	const float threehalfs = 1.5F;
    
    	x2 = number * 0.5F;
    	y  = number;
    	i  = * ( long * ) &y;            // evil floating point bit level hacking
    	i  = 0x5f3759df - ( i >> 1 ); // what the fuck?
    	y  = * ( float * ) &i;
    	y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
    	//      y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed
    
    	return y;
    }
    

    这里写图片描述
    图2 牛顿迭代法求开方倒数
    最原始的版本不是求开方,而是求开方倒数,也即1x\small \small \frac{1}{\sqrt{x}}。为啥这样,原因有二。首先,开方倒数在实际应用中比开方更常见,例如在游戏中经常会执行向量的归一化操作,而该操作就需要用到开方倒数。另一个原因就是开方倒数的牛顿迭代没有除法操作,因而会比先前的牛顿迭代开方要快。但是上面的代码貌似很难看出牛顿迭代的样子,这是因为函数变了,由y=x2a\small \small y=x^{2}-a变为y=1x2a\small \small y=\frac{1}{x^{2}}-a,因而求解公式也需改变,但是递推公式的推导不变,如图二所示。按照之前的推导方式我们有:
    xi=xi1yi1f(xi1)=xi1xi12a2xi13=xi1(1.50.5axi12)\small \small x_{i}=x_{i-1}-\frac{y_{i-1}}{{f}&#x27;\left ( x_{i-1} \right )}=x_{i-1}-\frac{x_{i-1}^{-2}-a}{-2*x_{i-1}^{-3}}=x_{i-1}*\left ( 1.5-0.5*a*x_{i-1}^{2} \right )
    由这个公式我们就很清楚地明白代码y =y*(threehalfs-(x2yy)); 的含义,这其实就是执行了单次牛顿迭代。为啥只执行了单次迭代就完事了呢?因为单次迭代的精度已经达到相当高的程度,代码也特别注明无需第二次迭代(达到游戏要求的精度)。图三给出了对从0.01到10000之间的数进行开方倒数的误差(from维基百科),可以看出误差很小,而且随着数的增大而减小。
    这里写图片描述
    图三 卡马克算法的误差
    为什么单次迭代就可以达到精度要求呢?根据之前的分析我们可以知道,最根本的原因就是选择的初值非常接近精确解。而估计初始解的关键就是下面这句代码:

    i  = 0x5f3759df - ( i >> 1 );
    

    正是由于这句代码,特别是其中的“magic number”使算法的初始解非常接近精确解。具体的原理又用到前面博客介绍的地址强转:首先将float类型的数直接进行地址转换转成int型(代码中long在32位机器上等价于int),然后对int型的值进行一个神奇的操作,最后再进行地址转换转成float类型就是很精确的初始解。
    在前面的博客中,我们曾经针对float型浮点数和对应的int型整数之间的关系给出一个公式:
    IxL×log2(x)+L×(Bσ)\small \small I_{x}\approx L\times log_{2}\left ( x \right )+L\times \left ( B-\sigma \right )
    其中,Ix\small \small I_{x}表示float型浮点数地址强转后的int型整数,L=223\small \small L=2^{23},x是原始的浮点数(尚未表示成float类型),B=127,σ\small \small \sigma是一个无穷小量。化简一下上述公式我们得到:
    log2(x)IxL(Bσ)\small \small log_{2}\left ( x \right )\approx \frac{I_{x}}{L}-\left ( B-\sigma \right )
    有了这个公式我们就可以推导初始解的由来了。要求y=1x\small \small y=\frac{1}{\sqrt{x}},我们可以将其等价转化成log2(y)=12log2(x)\small \small log_{2}\left ( y \right )=-\frac{1}{2}log_{2}\left ( x \right ),然后代入上面的公式我们就得到:
    Iy32L×(Bσ)12Ix\small \small I_{y}\approx \frac{3}{2}L\times \left ( B-\sigma \right )-\frac{1}{2}I_{x}
    这个公式就是神奇操作的数学表示,公式中只有σ\small \small \sigma是未知量,其它都已知。σ\small \small \sigma的值没有好的求解方法,数学家通过暴力搜索加实验的方法求得最优值为σ0.0450466\small \small \sigma \approx0.0450466,此时第一项就对应0x5f3759df。但是后来经过更仔细的实验,大家发现用0x5f375a86可以获得更好的精度,所以后来就改用此数。
    算法的最终目的是要对浮点数开平方,而原始的卡马克算法求的是开方倒数,所以我们最初的代码返回的结果是原始值乘以开方倒数。该算法性能非常高,而且精度也很高,三次迭代精度就和系统函数一样,但是速度只有系统函数sqrtf的十分之一不到,相当了得。

    4 改进的牛顿迭代

    卡马克算法也启发我们能不能对原始的牛顿迭代开方算法进行类似的修改。之前我们已经提供了一种方法去估计初始值,而且获得了不错的性能提升,我们希望通过按照卡马克算法的思路修改初始值的估计来获得更大的性能提升。要求y=x\small \small y=\sqrt{x},我们可以将其等价转化成log2(y)=12log2(x)\small \small log_{2}\left ( y \right )=\frac{1}{2}log_{2}\left ( x \right ),然后再代入上面的公式我们就得到:
    Iy12L×(Bσ)+12Ix\small \small I_{y}\approx \frac{1}{2}L\times \left ( B-\sigma \right )+\frac{1}{2}I_{x}
    新公式和卡马克公式非常相似,只是系数发生了变化。这也很好理解,本来开方和开方倒数的对数表示只差一个负号。这个公式也只有σ\small \small \sigma是未知量,其它都已知。我没有精力去暴力搜索它的最优值,只能估计几个:可以选择等于0,也可以选择和卡马克算法中一样,这样得到的magic number分别为0x1fc00000和0x1fbd1e2d。分别用这两个值去计算,效果差不多,和我们之前的初始值估计相比性能又提升了大约25%,但是还比库函数sqrtf慢一倍。
    这样的结果让人感到沮丧,按理说应该会比卡马克算法慢,但是依旧差20多倍就不能理解了,难道初始解选择的还不好?一怒之下,我将循环去掉,也改成只迭代三次,得到的结果和系统函数得到的结果一样,只是速度上慢了一倍而已!这个结果很令人吃惊,这说明do循环的开销其实很大。这个结论可以通过在卡马克算法中也添加do循环得到:如果在卡马克算法中添加for循环之后,运行速度立刻降了10倍!为什么do循环会如此慢呢?一个原因可能是只需fabsf的原因,其他原因还不详。
    通过速度慢一倍我们能得到什么结论呢?原始的牛顿迭代用了两次除法(加法忽略),而卡马克算法则用了三次乘法(在返回结果时还有一次),都是迭代三次,它们的性能相差一倍,我们可以推出除法的运行时间大约是乘法的三倍多。这个结论启示我们,优化掉除法是提速的一个重要途径。
    在猜测σ\small \small \sigma的值时,我们试验了两个很随意的值,但是结果却很好,是否会存在更好的σ\small \small \sigma呢?答案是肯定的,但是它只有在一次迭代的时候才会有影响(和原始的卡马克算法相比),如果迭代三次,则σ\small \small \sigma的值将影响不大,在某个区间里面的值都会得到同样的结果,运行时间也一样,因为结果已经足够精确。
    如果将我最开始估计初始值的do循环也去掉,则三次迭代精度达不到要求,说明我自己臆想出来的初始值还是太差,初始值估计确实是一门学问。总结一下牛顿迭代和卡马克算法,我们能得到什么经验教训呢?首先,为了获得最好的性能,代码中尽量不要有循环,这也就是循环展开存在的意义;其次,两个算法最后的对比完全是除法和乘法的对比,尽量通过数学变换消除代码中的除法,这也会带来不少的性能提升;深入了解浮点数在计算机中的存储结构很重要,在不少问题上会给我们带来很多极致性能的解法。

    5 SSE汇编指令

    优化是永无止境的。在高级语言领域,卡马克算法是目前最快的开方算法,但是在机器指令层面,邪恶的 Intel 提供了这样一条指令RSQRTSS,从硬件上支持卡马克算法。RSQRTSS是一条SSE指令,SSE(Streaming SIMD Extensions)指令也即单指令多数据流式扩展指令能够有效增强CPU浮点运算的能力。通常编译器也会提供SSE指令的高层实现,从而允许用户在C++代码中不用编写汇编代码就可直接使用SSE指令的功能。下面给出用该指令的代码(from寻找更快的平方根倒数算法):

    float SqrtByRSQRTSS(float a)
    {
    	float b=a;
    	__m128 in = _mm_load_ss(&b);
    	__m128 out = _mm_rsqrt_ss(in);
    	_mm_store_ss(&b, out);
    
    	return a*b;
    }
    

    由于sse指令用到的寄存器是128位,我们无法直接将float类型转化为__m128,而是调用sse专门的load和store指令。至于性能,在TIMINGSQUARE ROOT中有一个结果(如图四),但是我没有复现。而且当不做任何设置的时候,上述代码的运行速度比卡马克算法慢3倍,这说明编译器默认不启用SSE指令优化。当指定参数/arch:SSE之后性能匹配卡马克算法,但是也没有达到图四的三倍性能差距。但是Intel肯定不可能实现一个性能不如高级语言的指令,对SSE指令的更详细使用规则我不是很清楚,应该还是我没有掌握SSE编程的基本配置规则,因而图四的结果还是可信的。此外,还有一个稍微严重的问题,RSQRTSS的结果不精确,误差是 ±1.5*2^-12,对精度要求比较严格的应用不能使用该指令。
    这里写图片描述
    图四SSE指令与卡马克算法的性能对比
    在图四中第二行还显示了SQRTSS指令的性能,和改进的牛顿迭代法类似,性能也是慢于RSQRTSS指令,而且差距还不小。

    6 总结

    本博客对浮点开方常用的方法进行了一一介绍,希望能对大家产生些积极的影响。最后,将我的所有实验结果贴出来,供大家参考。我的CPU型号为双核32位酷睿2 T5750,内存2G,测试的内容是对1到300w内的整数进行开方运算,运行时间如下:
    这里写图片描述
    后来又在公司的服务器上重测了一遍,直接伤心了。服务器CPU为24核64位至强E5-2630,内存128G,编译器为花钱购买的icc编译器。测试的内容是对1到1000w内的整数进行开方运算,运行时间如下:
    这里写图片描述
    看到这个结果,我只能说系统函数无敌了(没有算错)!上面写的全部作废,以编译器实测为准……

    展开全文
  • 指针的运算

    2020-12-20 11:17:51
    1.赋值运算以下几种: 指针变量=&变量 指针变量=指针变量 指针变量=NULL 指针变量=0(不推荐使用) 2.指针移动 指针加减移动是以数据类型单元为单位移动的,移动字节数据类型种类而定,这关系到后面求...

    指针的运算

    指针的运算是指针对指针变量中地址值作为对象的运算,通过地址的变化来改变指针指向的对象。
    1.赋值运算常有以下几种:
    指针变量=&变量
    指针变量=指针变量
    指针变量=NULL
    指针变量=0(不推荐使用,有的计算机不认)
    2.指针移动
    在这里插入图片描述
    指针加减移动是以数据类型单元为单位移动的,移动字节数据类型种类而定,这关系到后面求sizeof()的大小。
    如:

     int a[5]={1,2,3,4,5}
     int *p=a;
     printf("%d",*(p+1));
     printf("%d",*p+1);
     printf("%d",*p++);
     printf("%d",*p--);
     printf("%d",*(--p));
    

    输出结果为2 2 1 2 0
    {
    *p+1 先取到a[0],然后a[0]+1=2
    *p++ 先取到a[0],输出a[0],之后由于++,所以p指向a[1]
    *p-- 由于上一步操作,让p指向了a[1],所以先输出a[1],然后由于–,p指向了a[0]
    *(- -p) 由于之前p指向了a[0],现在–p之后,p指向了a[-1],由于a[-1]没有定义,就默认为0。
    }
    需要注意的是计算机中计算是连贯的,上一步对下一步是有影响的。
    要说明的是,指针变量相减得两指针所指内存之间相差的内存单元个数,而两指针相加毫无意义。另外,指针是可以比较大小的,一般指向后面存储单元的要大于指向前面存储单元的。

    展开全文
  • 布尔运算是一种关系运算,包括以下类:对于布尔类型boolean,永远只有true和false两个值。比较运算符:>,>=,与运算&&或运算||非运算!什么是布尔掩码?布尔掩码是基于规则来抽取,修改,计数或者对...
  • 主要以下类:算术运算符比较运算符逻辑运算符成员运算符算术运算符算术运算符就是日常所用的加减乘除,这些运算符在计算机语言中可以用于数值类型运算。运算符描述例子+相加5+6 结果为 11-相减5-3 结果为 2*...
  • 实际业务中,多表关联运算十分常见,外键表、同维表、主子表这几种关联类型可能会混合出现。下面我们来看一个综合案例。 5.1 表结构和查询目标 某电商平台中和订单编号这个字段相关的6个表,主要表结构如下: ...
  • Python语言支持操作者以下几种类型。算术运算符比较(即关系)运算符赋值运算符逻辑运算符位运算符会员操作符标识操作符让我们逐一看看所有的运算符。Python算术运算符:假设变量a持有10和变量b持有20,则:[ 查看...
  • 几种指令类型特色,在MIPS处理器的底层电路逻辑实现中,也会针对这五类分别设计。 运算指令 算术运算 加法:A+BA+BA+B 减法:A−BA-BA−B 注:乘法,除法,乃至其他更高级的运算,本质上都可以最基本的加法...
  • C++类型强转

    千次阅读 2014-06-12 12:13:14
    数据类型强转,可以用C风格的强转和C++下的运算符强转。 数据类型强转包括:内置对象和内置对象之间,自定义对象和...有几种情况不能强转:自定义类型对象(无继承关系)之间不能强转;不能将父类对象转换为子类对象
  • 域上的一种运算的集合,若干关系经过笛卡尔积运算得到一个新的关系(表),该关系的每一条记录(行)都是以前所有关系(表)的每条记录(行)的全排列组合。 此新关系包括了涵盖了之前若干关系(表)中的所有信息。...
  • * 数据结构:相互之间存在一或多种特定关系的数据元素的集合,包括逻辑结构和物理结构。 * 数据类型:一个值的集合以及定义在这个值集合上的一组操作(增删改查读写…)的总称 可推出 数据结构 = 数据元素D...
  • 类型特点:相反,参与运算的变量类型发生改变,潜在出错的可能,但是计算机仍然执行指令。C语言是一类型语言。转换类型运算、赋值、函数参数、返回值运算:char a; int b, c; c = a + b; 在计算过程中,a...
  • c++的一大特性就是重载(overload),通过重载可以把功能相似的个函数合为一个...1.一般运算符重载在进行对象之间的运算时,程序会调用与运算符相对应的函数进行处理,所以运算符重载方式:成员函数和友元函数。
  • 1.C语言有多少个关键字? 32 2.变量与常量的区别是什么? // 变量可变 存在栈区 常量不可变 常量区3.... // 大小写 字母 数字 下划线 美元符 驼峰命名法,不能以数字开头4.c语言有哪五...逻辑运算有几种?判断原则是什么? /
  • 1、 QAC介绍和使用说明 其他的功能概括 1、提供一种可量化措施的代码度量值属性:33基于功能 32基于文件和4个项目级别 2、功能结构关系图,以提供控制流动洞察 ...有几种方法可以为此配置QAC,看附录B–extensions部分
  • 对于Java这个强类型语言来说,每种数据类型严格划分:运算符共分为算术运算符、赋值运算符、关系运算符(比较预算符)、逻辑运算符、位运算符和三目运算符(三元运算符)这几种,分别适用于不同的运算中。...
  • 5.1 关系运算和关系表达式(***) 5.2 逻辑运算与逻辑表达式 (***) 5.3 if语句 (***) 5.4 switch语句 (***) 5.5 程序举例 第 6 章 循环控制 6.1 概述 (*) 6.2 goto语句及if-goto循环 (*) 6.3 while语句 ...
  • 72、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 49 73、字节流与字符流的区别 50 74、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用...
  • Scala 含有丰富的内置运算符,包括以下几种类型: 算数运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 算数运算符+ - * / %都明白什么意思直接上实例 关系运算符实例 逻辑运算符 位运算符赋值运算符运算符...
  • Oracle PL/SQL 第三章--运算符与表达式 目录 Oracle PL/SQL 第三章--运算符与表达式 1、运算符分类 1.1、算术运算符 1.2、关系运算符 ...3、运算表达式 ...在PL/SQL中也丰富的几种内置运算符,如下
  • 引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...
  • 数据结构(绪论)

    2020-08-12 19:03:22
    文章目录数据结构(绪论)数据结构的定义数据结构中的个概念数据的逻辑结构数据四基本的逻辑结构:数据逻辑结构的多种表现形式数据的存储结构数据运算数据结构最常见的运算有:抽象数据类型数据类型:是指一组性质...
  • Scala 含有丰富的内置运算符,包括以下几种类型: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 算术运算符 算术运算符(arithmetic)是对数值类型的变量进行运算的,在Scala程序中使用的非常多...
  • 所有数据类型中最常用、相对比较简单、用硬件实现比较容易的几种。 数据结构: 由软件进行处理和实现的各种数据类型 研究:这些数据类型的逻辑结构和物理结构之间的关系并给出响应的算法。 系统结构设计者要解决的...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 244
精华内容 97
关键字:

关系运算有几种类型