²Ä¤Q¤­³¹¡@¥Î²Õ»y¹ê§@¹ï¼Æ¨ç¼Æ

³o¤@³¹±N¤¶²Ð¥Î²Õ¦X»y¨¥¡A°t¦X SSE «ü¥O¶°¡A¼¶¼g¹ï¼Æ¨ç¼Æ¡C³o¨àªº¹ï¼Æ¬O«ü¦ÛµM¹ï¼Æ¡A¤]´N¬O¥H e ¬°©³ªº¹ï¼Æ¡A¤@¯ë°O¬° ln¡C³o¨àªº e ºÙ¬°¦ÛµM±`¼Æ©Î¬O¤×©Ô¼Æ¡]Euler's number¡Ae = limn¡÷¡Û( 1+1n )n ¡^¡A¬ùµ¥©ó 2.71828182845904523536¡K¡K¡A¬OµL­­¤£´`Àô¤p¼Æ¡C­pºâ¥X¦ÛµM¹ï¼Æ¤§«á¡A«Ü®e©ö´N¯à¸g¥Ñ´«©³¤½¦¡­pºâ¥X±`¥Î¹ï¼Æ¨Ó¡Alog x = ln xloge 10¡A¨ä¤¤ªº¤À¥À loge 10 ¬°¤@±`¼Æ¡A¬ùµ¥©ó 0.4342944819¡C


­ì²z

§Q¥Î°ò¦¹ï¼Æ«ß»P®õ°Ç®i¶}¦¡­pºâ¹ï¼Æ

·Q­nºâ¥X¥ô·N¤@­Ó¥¿¯BÂI¼Æ x ªº¦ÛµM¹ï¼Æ¡A¥i¥H¨Ì·Ó¤U­±¤è¦¡«ä¦Ò¡C¥ô·N¥¿¼Æ¡Ax ¥i¥H¼g¦¨

x = m ¡Ñ 2p;¨âÃä¨ú¦ÛµM¹ï¼Æ
ln x = ln ( m¡Ñ2p ) = ln m + p¡Ñln 2;¦¹¬°²Ä⑴¦¡¡A¥B 1≤ m < 2¡Ap ¬°¾ã¼Æ

¤W­±ªº¦¡¤l¤¤¡Aln 2 ¬O±`¼Æ¡A¬ùµ¥©ó 0.69314718055994530942¡Cp ¬O 2 ªº¾­¦¸¤è¡A¬O¾ã¼Æ¡A¦b IEEE 754 Âùºë½T«×¯BÂI¼Æªºªí¥Ü¤è¦¡¤¤¡A¦ì©ó²Ä 52¡ã62 ¦ì¤¸¡]½Ð°Ñ¾\²Ä¤Q¤@³¹¡^¤¤¡C¦ý±q³o¤Q¤@­Ó¦ì¤¸±o¨ìªº¬O«ü¼Æ°¾²¾­È¡AÁÙ¶·´î¥h 1023 ¤~¬O¯u¥¿ªº«ü¼Æ¡C¨ì¦¹¡A¤W¦¡ªº²Ä¤G¶µ¤w¸gºâ¥X¨Ó¤F¡C

¦Ü©ó­pºâ²Ä¤@¶µ¡A¥ý­n¨ú±o¦³®Ä¼Æ m¡A¥¦¦s©ñ©óÂùºë½T«×¯BÂI¼Æªº²Ä 0¡ã51 ¦ì¤¸¡A¦ý³o³¡¤À¶È¶È¬O¤p¼Æ³¡¤À¡AÁÙ¶·³B²z¥¿³W¤Æªº°ÝÃD¡A¦]¦¹µ{¦¡¦p¤U¡G

        movq    r9,xmm0
        and     r9,0FFFFFFFFFFFFFh   ;¥u¯d¦³®Ä¼Æ
        or      r9,3FF0000000000000h ;¥¿³W¤Æ¡A¨ÏRDX=m=1.xxxx

³o¼Ë R9 ¼È¦s¾¹¤º´N¬O m¡A±µ¤U¨Ó´N¥i¥H¥Î®õ°Ç¯Å¼Æ­pºâ ln m ¤F¡C¦ý³o¨à¥Î¤@­Ó¸û°½Ãiªº·Qªk¡G¦Ò¼{¤@­ÓµL½aµ¥¤ñ¼Æ¦C¡A­º¶µ¡Aa1=1¡F¤½¤ñ¡Ar= -y¡F¥B | y | < 1¡A©Ò¥H³o­ÓµL½aµ¥¤ñ¼Æ¦C¬O 1¡B-y¡By2¡B-y3¡By4¡B-y5¡K¡K¡A¦pªG­n­pºâ¥¦ªºÁ`©M¡A¥N¤Jµ¥¤ñ¯Å¼Æ¤½¦¡¡G a1-a1rn 1 - r¡A¦]¬° a1=1¡Ar=-y¡A¤S¦]¬° n¡÷¡Û ¬G rn=0¡A©Ò¥H¦¹µ¥¤ñ¼Æ¦CÁ`©M¬O11+y¡A

1 - y + y2 - y3 + y4 - y5 +¡K¡K= 11+y;¤Ï¹L¨Ó¼g  
11+y = 1 - y + y2 - y3 + y4 - y5 + ¡K¡K;¨âÃä¨ú¿n¤À  
11+y dy = ( 1 - y + y2 - y3 + y4 - y5 +¡K¡K) dy;®Ú¾Ú·L¿n¤À¡A11+y ªº¿n¤Àµ¥©ó ln(1+y)
ln(1+y) = y - y22 + y33 - y44 + y55 - y66 + ¡K¡K+ C;±ý¨D C¡A¥i¨Ï y=0 ¥N¤J¡A¨Ïµ¥¸¹¥kÃ䪺 y¡By22¡K¡K¬Ò¬° 0¡A±o C=0
ln(1+y) = y - y22 + y33 - y44 + y55 - y66 + ¡K¡K;²Ä⑵¦¡  

¥O y = m-1¡A«h m= 1+y¡A¥N¤J⑵±o

ln m = y - y22 + y33 - y44 + y55 - y66 + ¡K¡K

±N¤W¦¡¥N¤J²Ä⑴¦¡¡A´N¥i¥Hºâ¥X ln x ¤F¡C»P«e¤@³¹¤@¼Ë¡A¥i¥H¥Î¯³¤E»àºâªk§â¤W¦¡ÂàÅܦ¨

ln m = y( 1- y2 + y23 - y34 + y45 - y56 + ¡K¡K)
     = y( 1-y( 12 - y3 + y24 - y35 + y46 - ¡K¡K) )
      ⁝
     ≈ y( 1-y( 12 -y( 13 -y( 14 -y( 15 -y( 16 - y7 ) ) ) ) ) ) ;°²¦p¥uªñ¦ü¨ì y7

Âǥѯ³¤E»àºâªk¥i¥H¨Ï¥Î°j°é¡AÅýµ{¦¡½s¼gÅܱoºë²¡C

³Ì¨Î¤Æ

¥Î¤W­±ªº¹ï¼Æ«ß»P®õ°Ç®i¶}¦¡¡A¨Ó­pºâ¦ÛµM¹ï¼Æ¡A¬O¥i¦æªº¡C¦ý¬O¦]¬°¥¿¾ã¼Æ±q 1 ¶}©l¡A¦Ó¨ä­Ë¼Æ¡A1¥¿¾ã¼Æ¡A¦¬Àıo«ÜºC¡A¤×¨ä¬O·í m Â÷ 2 ¶Vªñ¡Ay ´NÂ÷ 1 ¶Vªñ¡A¦¬Àıo¶VºC¡C§ï¨}ªº¤èªk¬O¡A·í m > ¡Ô2 ®É¡A§â m °£¥H 2¡AµM«á¨Ï p ¼W¥[¤@¡A³o¼Ëªº¸Ü¯à¦¬Àıo§Ö¤@¨Ç¡C

¦^¨ì°ÝÃDªº·½ÀY¡A§Ú­Ì­n­pºâªº¬O ln x¡A©Ò¥H§â x Âà´«¦¨Ãþ¦ü¬ì¾Ç°O¸¹ªºªí¥Ü¤è¦¡¡A¦ý¨Ã«D¥H 10 ¬°©³¼Æ¡A¦Ó¬O¥H 2 ¬°©³¼Æ¡G

x = m ¡Ñ 2p

¦³®Ä¼Æ m ªº½d³ò¬O 1 ≤ m < 2¡A¦Ó§Ú­Ì¨Ï¥Îªº®õ°Ç®i¶}¦¡¬O y ªº¨ç¼Æ¡A¦Ó y=m-1¡A¬G y ªº½d³ò¦b 0 ≤ y < 1¡C·í y ¶V±µªñ 1¡A®õ°Ç®i¶}¬O¦¬Àıo¶VºC¡C³oùØ»¡ªº³Ì¨Î¤Æ¬O°²¦p m > ¡Ô2 ®É¡A§â m °£¥H 2¡AµM«á¨Ï p ¼W¥[¤@¡C

³o®É·|¹J¨ì¨âºØ±¡§Î¡G

⑴¡B¦pªG 1 ≤ m ≤ ¡Ô2¡G¦]¬° m ¤w¸g°÷¤p¤F¡A©Ò¥Hµ{¦¡¤°»ò¤]¤£°µ¡Am ªº½d³ò¬O 1 ≤ m ≤ ¡Ô2¡C

⑵¡B¦pªG¡Ô2 < m < 2¡G­ì¨Óªº¼Æ¡Ax¡A¤j¤p¤´¤£ÅÜ¡A¦ý§â¦³®Ä¼ÆÁY¤pÅܬ°¤@¥b¡AÁY¤pªº³¡¤À®¿²¾¨ì«ü¼Æ¥h¤F¡G

x = m ¡Ñ 2p = m2 ¡Ñ 2p+1

m ­ì¨Óªº½d³ò¬O ¡Ô2 < m < 2¡A§â m °£¥H 2 ¤§«á¡A·sªº m ½d³ò¦b ¡Ô22 < ·sªº m < 1¡A¾ã²z«á ¡Ô0.5 < ·sªº m < 1¡C

¦]¬° ¡Ô0.5 ¬ùµ¥©ó 0.7071¡A©Ò¥Hºî¦X¤W­z¨âºØ±¡§Î¡Am ªº½d³ò¸¨¦b ¡Ô0.5 < m ≤ ¡Ô2¡C¦Ó§Ú­Ì­pºâ ln m ªº®õ°Ç®i¶}¦¡¬O y ªº¨ç¼Æ¡A¦Ó y= m-1¡A¦]¦¹ y ªº½d³ò¬O ¡Ô0.5 -1 < y ≤ ¡Ô2 -1¡A¾ã²z«á±o¨ì y ªº½d³ò¬ù¦b -0.2929 < y ≤ 0.4142¡C³o­Ó½d³ò§ó±µªñ 0¡A¤ñ¥¼³Ì¨Î¤Æªº½d³ò¡A0 ≤ y < 1¡A¦n¦h¤F¡C

C »y¨¥¼Ð·Ç¨ç¦¡¡Gstrtod

strtod ¬O C/C++ ¼Ð·Ç¨ç¦¡¡A¥¦¯à§â ANSI ¼Æ¦r¦r¦êÂà´«¬°Âùºë½T«×¯BÂI¼Æ¡A¥Îªk¬O¡G

double strtod(
   const char *strSource,
   char **endptr
);

*strSource ¬O­nÂà´«ªº ANSI ¦r¦ê¦ì§}¡A¸Ó¦r¦ê¤º§t¦³¤@³s¦êªºªü©Ô§B¼Æ¦r¨Ã¥H 0 µ²§À¡Astrtod ·|±N³o¦r¦êÂà´«¦¨Âùºë½T«×¯BÂI¼Æ¡A¨Ã¦s©ó XMM0 ¼È¦s¾¹ªð¦^¡C**endptr ¬O¬Y­ÓÅܼƦì§}¡A³o­ÓÅܼƥ²¶·¬O¥|¦r²Õªø¡Astrtod ·|§âµ²§Àªº 0 ¤§¦ì§}©Î¬O²Ä¤@­ÓµLªkÂà´«¬°¼Æ­È¦r¤¸ªº¦ì§}¡A¦s¤J©ó¦¹ÅܼƤ¤¡CÀ³¥Îµ{¦¡ÂǦ¹Àˬd endptr ÅܼƤºªº¦ì§}©Ò«ü¦Vªº¦a¤è¬O§_¬° 0¡A¦pªG¬O 0¡Aªí¥Ü¥¿±`µ²§ô¡F¦pªG¤£¬O 0¡Aªí¥ÜÂà´«ªº ANSI ¦r¦ê§t¦³¥¼¯àÂà´«¦¨¼Æ­Èªº¦r¤¸¡C

­nÂà´«ªº ANSI ¦r¦ê¥i¥H¥H¼Æ­ÓªÅ¥Õ©Î¸õ®æ¦r¤¸°_ÀY¡Astrtod ·|©¿²¤¡C¦¹¦r¦ê¦bªü©Ô§B¼Æ¦r¦r¤¸¤§«e¡A¥i¥H²K¥[¤@­Ó¡u+¡v©Î¡u-¡v¦r¤¸¡Aªí¥Ü³oÂà´««áªºÂùºë½T«×¯BÂI¼Æ¬O¥¿¼ÆÁÙ¬O­t¼Æ¡A¦ý¥¿­t¸¹»P¼Æ¦r¦r¤¸¤§¶¡¤£¯à¦³ªÅ¥Õ¡C­nÂà´«ªº ANSI ¦r¦ê¤]¥i¥H¥]§t¡uE¡v©Î¡ue¡v¡A¥Nªí®Éªº¾­¦¸¤è¡C¨Ò¦p©³¤Uªº¨Ò¤l¡G

szValue1    DB      9,"  96485.3321",0  ;XMM0=96485.3321¡Astrtod ¥i¥H¸õ¹L«e­±ªºªÅ¥Õ©Î¸õ®æ¦r¤¸¡A9 ¬O¸õ®æ¦r¤¸
szValue2    DB      "96,485.3321",0     ;XMM0=96¡A¡u,¡v¬OµL®Äªº¦r¤¸
szValue3    DB      "96485.33 21",0     ;XMM0=96485.33¡A¤£¦b¶}ÀYªºªÅ¥Õ©Î¸õ®æ¦r¤¸¡Aµø¬°µL®Äªº¦r¤¸
szValue4    DB      "-9.6485E4",0       ;XMM0=-96485¡A¡uE¡v«á­±ªº¼Æ¦r¦r¤¸¥Nªí¤Qªº¾­¦¸¤è
szValue5    DB      "9.6485E-4",0       ;XMM0=0.00096485¡A¡uE¡v«á­±ªº¼Æ¦r¦r¤¸¥Nªí¤Qªº¾­¦¸¤è
szValue6    DB      "2.175E 6",0        ;XMM0=2.175¡A¡uE¡v«á­±¤£¥i±µªÅ¥Õ¡A¦pªG³o¼Ë·|¾É­P³s¡uE¡v¤]¬OµL®Äªº

¦pªG strtod ¦¨¥\¦a±N¦r¦êÂà´«¦¨Âùºë½T«×¯BÂI¼Æ¡A¨º»ò¦^¶Ç­È´N¬O XMM0¡A¨ä§C¥b³¡´N¬OÂà´««áªºÂùºë½T«×¯BÂI¼Æ¡C¦pªG¥u¦³¦r¦êªº«e­±³¡¤À¯àÂà´«¦¨¼Æ­È¡A¦Ó«á¦³¥¼¯àÂà´«¦¨¼Æ­Èªº¦r¤¸¡A¨º»ò XMM0 ·|µ¥©ó¤wÂà´«ªº¼Æ­È¡A¦Ó endptr ¬O²Ä¤@­ÓµLªkÂà´«¬°¼Æ­È¤§¦r¤¸ªº¦ì§}¡C¦pªG¦r¦êªº²Ä¤@­Ó¦r¤¸´N¬OµLªkÂà´«¦¨¼Æ­È¡A©Î¬O¦r¦ê³Ì«e­±¬O¼Æ­ÓªÅ¥Õ©Î¸õ®æ¦r¤¸¦Óºò±µ¨ä«áªº¦r¤¸µLªkÂà´«¦¨¼Æ­È¡A¨º»ò XMM0 µ¥©ó 0.0¡A¦Ó¥B endptr ¤ºªº¦ì§}´N¬O¦r¦êªº¦ì§}¡C

GetCommandLine API

GetCommandLine ¥i¥HÀò±o©R¥O´£¥Ü¦C¤Wªº¦r¦ê¡C¥¦¨S¦³°Ñ¼Æ¡A©Ò¥H©I¥s¤è¦¡¥i¥Hª½±µ¨Ï¥Î x64 «ü¥O¡ACALL¡A¦]¬° MASM64 SDK ªº invoke ¥¨¶°¡A³£¬O¬°¤F±N°Ñ¼Æ¦s¤J¼È¦s¾¹©Î°ïÅ|ªº¡A¬JµM GetCommandLine ¨S¦³°Ñ¼Æ¡A´N¥i¥Hª½±µ¨Ï¥Î CALL «ü¥O¡C©³¤U¬O GetCommandLine ªº­ì«¬¡G

LPSTR GetCommandLine();

GetCommandLine ªº¦^¶Ç­È¬O RAX¡A¥Nªí©R¥O¦r¦êªº¦ì§}¡C©Ò¿×©R¥O¦r¦ê¬O«ü¨Ï¥ÎªÌ¦b©R¥O´£¥Ü¦r¤¸©³¤U©Ò¿é¤Jªº¤å¦r¡A¥]§tÀ³¥Îµ{¦¡¦WºÙ¤Î¤§«áªº°Ñ¼Æ¡]¥ç¥iºÙ¬°¿ï¶µ¡^¡A³Ì«áÁÙ¦³µ²§Àªº¹s¡C¨Ò¦p¤U¹Ï¤¤¬õ¦â®Ø¤º¡A¨Ï¥ÎªÌ°õ¦æ¡uln.exe¡v®É¡A¦b¡uln¡v¤§«áºò±µµÛÀ³¥Îµ{¦¡¯à±µ¨üªº°Ñ¼Æ¡u300.889¡v¡A¨º»ò©R¥O¦r¦ê´N¬O¡uln 300.899¡v³Ì«á¦A¥[¤Wµ²§Àªº 0¡C

¦pªGÀ³¥Îµ{¦¡¦b¡uE:\HomePage\SOURCE\My App\LN.EXE¡v¡A¦Ó·í«e¥Ø¿ý¬O¡uC:\Users\me\¡v¡A¨º»ò­n°õ¦æ LN.EXE¡A¶·¥H¤U­±¤è¦¡¿é¤J«ü¥O¡C³o¬O¦]¬°¡uMy App¡v§t¦³ªÅ¥Õ¦r¤¸¡A¥²¶·¥Î¤@¹ï " " ¬A¦í¡C

C:\Users\me>"E:\HomePage\SOURCE\My App\LN" 300

³o®É­Ô¡A©R¥O¦r¦êÅܦ¨¡u"E:\HomePage\SOURCE\My App\LN" 300¡v,0¡C¦pªG¨Ï¥ÎªÌ¿é¤J®É¡A¶È¥Î¤@¹ï " " §â§tªÅ¥Õ¦r¤¸ªº¥Ø¿ý¦WºÙ¬A¦í¡A¤]¬O¥i¥Hªº¡A¨Ò¦p¿é¤J

C:\Users\me>E:\HomePage\SOURCE\"My App"\LN 300

³o¼Ëªº¸Ü¡A©R¥O¦r¦ê´NÅܦ¨¡uE:\HomePage\SOURCE\"My App"\LN 300¡v,0¡C¦ý¬O¤£¥i¥H¹³¤U­±¨º¼Ë¡G

C:\Users\me>"E:\HomePage\SOURCE\My App\LN 300"

³o¼Ëªº¸Ü¡A©R¥O´£¥Ü¦r¤¸·|¥H¬°­n°õ¦æ¡uLN 300.EXE¡v¥i°õ¦æÀÉ¡A¦Ó«D¡uLN.EXE¡v¡A³o·íµM·|µo¥Í¿ù»~¡C

SSE «ü¥O¡GCVTSI2SD »P CVTSI2SS

CVTSI2SD «ü¥O¥þ¦W¬° convert signed integer to scalar double-precision floating-point¡A·N«ä´N¬O§â¤@­Ó 32 ¦ì¤¸©Î 64 ¦ì¤¸ªº¦³¸¹¾ã¼ÆÂà´«¬°Âùºë½T«×¯BÂI¼Æ¡A¨Ã¦s¤J XMM ¼È¦s¾¹ªº§C¥b³¡¡C¥¦ªº»yªk¬O

CVTSI2SD XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸
CVTSI2SS XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸

CVTSI2SD ªº¥Øªº¹Bºâ¤¸¥u¯à¬O XMM ¼È¦s¾¹¡A¨Ó·½¹Bºâ¤¸¥i¥H¬O³q¥Î¼È¦s¾¹©Î°O¾ÐÅéÅܼơA¦ý¤£¯à¬O XMM ¼È¦s¾¹¡C¨Ó·½¹Bºâ¤¸¥i¥H¬O 32 ¦ì¤¸©Î 64 ¦ì¤¸¡A¤£¹L³£·|Âà´«¦¨Âùºë½T«×¯BÂI¼Æ¡A¦s©ó¥Øªº¹Bºâ¤¸ªº§C¥b³¡¡A¦Ó°ª¥b³¡¤£·|²M¹s¡C

­nª`·Nªº¬O 64 ¦ì¤¸¦³¸¹¼Æªººë½T«×¬O 63 ¦ì¤¸¡A¦ÓÂùºë½T«×¯BÂI¼Æªº¦³®Ä¼Æ¬O 53 ¦ì¤¸¡A©Ò¥H¦pªG¬O«Ü¤j©Î«Ü¤pªº¾ã¼Æ¡]µ´¹ï­È¶W¹L 253¡^¡A´N·|¨Ì¾Ú MXCSR ¼È¦s¾¹ªº RC ¦ì¤¸¡A¶i¦æ±Ë¤J¡A¦]¦¹³oºØ±¡§Î·|·l¥¢ºë½T«×¡C¦Ü©ó 32 ¦ì¤¸¾ã¼ÆÂà´«¦¨Âùºë½T«×¯BÂI¼Æ¡A´N¨S¦³³o­Ó°ÝÃD¡C

CVTSI2SS «ü¥O»P CVTSI2SD Ãþ¦ü¡A§â¦ì©ó¨Ó·½¹Bºâ¤¸¤ºªº 32 ¦ì¤¸©Î 64 ¦ì¤¸¦³¸¹¾ã¼Æ¡AÂà´«¦¨³æºë½T«×¯BÂI¼Æ¡A¨Ã¦s©ó¥Øªº¹Bºâ¤¸ªº XMM ¼È¦s¾¹²Ä 0¡ã31 ¦ì¤¸¤º¡CXMM ¼È¦s¾¹ªº 32¡ã127 ¦ì¤¸¤£¨ü¼vÅT¡C³æºë½T«×¯BÂI¼Æªº¦³®Ä¦ì¼Æ¶È 24 ¦ì¤¸¡A¦]¦¹¦pªG¬O«Ü¤j©Î«Ü¤pªº¾ã¼Æ¡A¤]·|¦]¬°±Ë¤J¦Ó­±Á{ºë½T«×·l¥¢ªº°ÝÃD¡C

CVTSI2SS »P CVTSI2SD ªº¨Ó·½¹Bºâ¤¸¦pªG¬O°O¾ÐÅéÅܼơA¤£»Ý­n¹ï»ô¸`¦ì§}¡F¦ý¬O¦pªG¹ï»ô¡A·|¦³¸û¦nªº®Ä²v¡C³o¨â­Ó«ü¥O³£¤£·|²£¥ÍµL®Ä¾Þ§@¡B·¸¦ì¡B°£¹sµ¥¨Ò¥~¡F¦ý¦pªGµo¥Í±Ë¤J¡A·|³]©w MXCSR ¼È¦s¾¹ªº PE ºX¼Ð¡C

SSE «ü¥O¡GUCOMISD »P UCOMISS

UCOMISD ¬O¥Î¨Ó¤ñ¸û¨â­ÓÂùºë«×¯BÂI¼Æªº SSE2 «ü¥O¡A¥þ¦W¬O unordered compare scalar double-precision floating-point values and set integer EFLAGS¡C¥¦ªº»yªk¬O

UCOMISD XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸
UCOMISS XMM¼È¦s¾¹,¨Ó·½¹Bºâ¤¸

UCOMISD ªº¥Øªº¹Bºâ¤¸¥u¯à¬O XMM ¼È¦s¾¹¡A¨Ó·½¹Bºâ¤¸¥i¥H¬O XMM ¼È¦s¾¹©Î 64 ¦ì¤¸ªøªº°O¾ÐÅéÅܼơCUCOMISD ±N¥Øªº¹Bºâ¤¸ªº§C¥b³¡»P¨Ó·½¹Bºâ¤¸¤ñ¸û¡]¦pªG¨Ó·½¹Bºâ¤¸¬O XMM ¼È¦s¾¹¡A¨º´N¤ñ¸û§C¥b³¡¡^¡A¤ñ¸ûµ²ªG¨Ã¤£¼g¦^¥Øªº¹Bºâ¤¸¡A¦Ó¬O³]©wºX¼Ð¼È¦s¾¹¡AµM«á·f°t JA¡BJB¡BJAE¡BJBE¡BJE¡BJNE¡BJP µ¥±ø¥ó¸õÅD«ü¥O¡C

UCOMISS »P UCOMISD Ãþ¦ü¡A¦ý¬O UCOMISS ªº¥Øªº¹Bºâ¤¸¥u¯à¬O XMM ¼È¦s¾¹¡A¨Ó·½¹Bºâ¤¸¥i¥H¬O XMM ¼È¦s¾¹©Î 32 ¦ì¤¸ªøªº°O¾ÐÅéÅܼơCUCONISS ¥u¤ñ¸û¥Øªº¹Bºâ¤¸ªº 0¡ã31 ¦ì¤¸³æºë½T«×¯BÂI¼Æ»P¨Ó·½¹Bºâ¤¸¤ñ¸û¡]¦pªG¨Ó·½¹Bºâ¤¸¬O XMM ¼È¦s¾¹¡A¨º´N¤ñ¸û²Ä 0¡ã31 ¦ì¤¸¡^¡A¨ä¥L©Ê½è³£»P UCOMISS ¬Û¦P¡C

ºX¼Ð¼È¦s¾¹¡]EFLAGS¡^±`¥Î©ó¾ã¼Æ¡]integer¡^¤ñ¸û¡A©Ò¥H UCOMISD¡BUCOMISS ¤¤¦³­Ó I¡A´N¬O¦]¬°³o­ì¦]¡C¤ñ¸ûµ²ªG¦p¤U¡G

±ø¥óZFCFPF±ø¥ó¸õÅD«ü¥O
¥Øªº¹Bºâ¤¸>¨Ó·½¹Bºâ¤¸000JA/JNBE
¥Øªº¹Bºâ¤¸=¨Ó·½¹Bºâ¤¸100JE/JZ
¥Øªº¹Bºâ¤¸<¨Ó·½¹Bºâ¤¸010JB/JC
¥ô¤@¹Bºâ¤¸¬° NaN111JP

¦¹¥~­nª`·Nªº¬O¡A¯BÂI¼Æ¤£¤À¦³¸¹¼Æ©ÎµL¸¹¼Æ¡A©Ò¥H­^¯Sº¸³W©w UCOMISD ¤§«áªº±ø¥ó¸õÅD«ü¥O³£²Î¤@¨Ï¥Î JA¡BJB¡A¤£¥i¨Ï¥Î JL¡BJG¡C¨Ò¦p©³¤Uªº¨Ò¤l¡A¦]¬°¡Ð2.1>¡Ð5.4¡A©Ò¥H·|µo¥Í¸õÅD¦Ü greater: ³B¡A¬G³Ì«á AX=1¡Cµ{¦¡½X¦p¤U¡G

x        REAL8   -2.1
y        REAL8   -5.4
          ⁝
         movq    xmm6,x
         ucomisd xmm6,y
         ja      greater
         mov     ax,0
         jmp     short ok
greater: mov     ax,1
ok:

UCOMISD¡BUCOMSS ¹ï©ó¯S®í¼Æ­Èªº³B²z¡A¤]«ÜÁo©ú¡C¨Ò¦p¥¦­Ì·|§â©¿²¤­t¹sªº²Å¸¹¡A¦]¦¹­t¹sµ¥©ó¥¿¹s¡C¹ïµL­­¤jªº³B²z¬O¡G¥¿µL­­¤j > ¥ô¦ó¦³­­¼Æ > ­tµL­­¤j¡C¹ï NaN ªº³B²z¬O¥u­n¤ñ¸ûªº¹Bºâ¤¸¤¤¡A¦³¥ô¦ó¤@­Ó¹Bºâ¤¸¬O NaN¡A¨º»ò´N·|³]©w¦P¦ìºX¼Ð¡]parity flag¡Aµù¤@¡^¡C

NaN ¬O not a number ªº·N«ä¡A¤¤¤å¥i½Ķ¦¨«D¼Æ­È¡A®Ú¾Ú IEEE 754 ¥u­n¬O«ü¼Æ°¾²¾­È©Ò¦³¦ì¤¸§¡¬° 1¡A¦³®Ä¼Æ¦r¤£¥i¥þ¬° 0¡]¥u­n¥ô¤@¦ì¤¸©Î¼Æ­Ó¦ì¤¸¬O¤@§Y¥i¡^¡A³o¼Ëªº¸ê®ÆºÙ¬° NaN¡CNaN ¦³´X­Ó¯S®íªº¯S©Ê¡G
①¡BNaN »P¥ô¦ó¼Æ¡]¥]¬A¦Û¨­¡^¤ñ¸û³£¤£¬Ûµ¥¡C
②¡B¯A¤Î NaN ªº¤j³¡¤À¹Bºâµ²ªG¤´¬° NaN¡C¨Ò¦p NaN+5¡BNaN¡Ñ0 µ¥µ²ªG³£¬O NaN¡C

NaN ¤À¬°¨âºØ¡G

⑴¡BQNaN¡GQ ¬O quiet ªºÁY¼g¡AQNaN ¥i½Ķ¦¨ÀRÀq«¬«D¼Æ­È¡A¦³®Ä¼Æ¦rªº³Ì°ª¦ì¤¸¬° 1 ªº NaN ´N¬O QNaN¡C·íµ{¦¡°õ¦æ¤F¼Æ¾Ç¤WµLªk©w¸q©Î¶W¥X¤F¯BÂI¼Æªí¥Ü½d³òªº¹Bºâ®É¡A¨Ò¦p 0¡Ò0¡B¡Û¡Ð¡Û¡B¡Û¡Ñ0¡B­t¼Æ¥­¤è®Úµ¥µ¥¡A´N·|²£¥Í QNaN¡C·í²£¥Í QNaN ®É¡A¤£·|IJµo¥ô¦óµwÅé²§±`©Î¨Ò¥~¡]exception¡^¡A¦Ó¬OÀqÀqªº¡]quiet¡^§â NaN ªºª¬ºA¶Ç¼½¤U¥h¡C

⑵¡BSNaN¡GS ¬O signaling ªºÁY¼g¡ASNaN ¥i½Ķ¦¨«H¸¹«¬«D¼Æ­È¡A¦³®Ä¼Æ¦rªº³Ì°ª¦ì¤¸¬° 0 ªº NaN ´N¬O SNaN¡C¤@¯ëªº¼Æ¾Ç¹Bºâ´X¥G¤£·|²£¥Í SNaN¡A¦Ó¬O¹w¥ý§â SNaN ¦s©ó°O¾ÐÅéÅܼÆùØ¡A¥ÑÀ³¥Îµ{¦¡¥hŪ¨ú³o­Ó§t¦³ SNaN ªºÅܼơA¥D­n¥Øªº¬O¬°¤F°£¿ù¡C·í CPU ¹J¨ì SNaN °Ñ»P¹Bºâ®É¡A·|¦Û°Ê±N MXCSR ¼È¦s¾¹ªº²Ä¹s¦ì¤¸¡AIE ³]¬° 1¡Aªí¥Üµo¥ÍµL®Ä¹Bºâ¡F¦AÀˬd MXCSR ¼È¦s¾¹ªº IM ¦ì¤¸¬O 0 ÁÙ¬O 1¡G

ⓐ¡B­Y IM ¦ì¤¸¬° 0¡A´N¤ÞµoµwÅ餤Â_¡Aµ{¦¡±Y¼ì©Î¶i¤J¨Ò¥~³B²zµ{¦¡¡C

ⓑ¡B­Y IM ¦ì¤¸¬° 1¡A¤£¤Þµo¤¤Â_¡A¦Û°Ê±N SNaN Åܬ° QNaN¡AÄ~Äò°õ¦æ­ì¨ÓªºÀ³¥Îµ{¦¡¡C


¹ê§@¦ÛµM¹ï¼Æ¨ç¼Æ

ÁA¸Ñ¤F­ì²z¤§«á¡A´N¥i¥H¥Î²Õ¦X»y¨¥¼g¥X­pºâ¦ÛµM¹ï¼Æªº­ì©lµ{¦¡¤F¡C­ì©lµ{¦¡¦p¤U¡G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
;LN.ASM¥Î©ó­pºâ¦ÛµM¹ï¼Æ¨ç¼Æ¡C
INCLUDE E:\masm64\include64\masm64rt.inc
EXTRN   strtod:PROC,printf:PROC
;****************************************************************************************
.DATA
number DQ ?
endptr DQ ?
szHint DB "¨Ï¥Î¤è¦¡¡G©ó©R¥O´£¥Ü¦r¤¸¿é¤J",0Dh,0Ah,"  ln ¥¿¼Æ",0Dh,0Ah,\
           "¥»À³¥Îµ{¦¡´N¯àÀ°§Aºâ¥X¸Ó¥¿¼Æªº¦ÛµM¹ï¼Æ¡]§Yln­È¡^¡C",0
szErr  DB "µLªk­pºâ¹s©Î­t¼Æªº¹ï¼Æ­È¡A©Î¿é¤J«D¼Æ­È¡C",0
szFmt  DB "ln %g=%.15g",0
;****************************************************************************************
.CODE
;----------------------------------------------------------------------------------------
ln      PROC    x:QWORD
;­pºâxªº¦ÛµM¹ï¼Æ¡A§Y­pºâln x
;¿é¤J¡GXMM0¡ÐXMM0¤º¦s¦³­n­pºâ¦ÛµM¹ï¼Æªº¼Æ­È(Âùºë½T«×¯BÂI¼Æ)¡A¥B¥²¶·¬O¥¿¼Æ
;¿é¥X¡G­YRAX=0¡Aªí¥Ü¿é¤Jªºx¬°0¡B­t¼Æ¡B-¡Û¤ÎNaN¡AµLªk­pºâ¨ä¦ÛµM¹ï¼Æ
;¡@¡@¡G­YRAX=1¡AXMM0=ln x(­Yx=+¡Û¡Aln x=+¡Û¡ARAX=1)
;­ì²z¡Gln x=ln(m¡Ñ2^p)=ln m + p*ln 2
;¡@¡@¡@ln m=y-(y^2)/2+(y^3)/3-(y^4)/4+...
        movq    x,xmm0
        jmp     start
ALIGN   16
SignMsk DQ      8000000000000000h,0     ;Åܸ¹
coeff DQ 0.05555555555555555556,0.05882352941176470588,\ ;1/18, 1/17
0.0625,                0.06666666666666666667,\ ;1/16, 1/15
0.07142857142857142857,0.07692307692307692308,\ ;1/14, 1/13
0.08333333333333333333,0.09090909090909090909,\ ;1/12, 1/11
0.1, 0.11111111111111111111,0.125, 0.14285714285714285714,\ ;1/10, 1/9, 1/8, 1/7
0.16666666666666666667,0.2, 0.25,  0.33333333333333333333,\ ;1/6,  1/5, 1/4, 1/3
0.5, 1.0 ;1/2, 1
one    DQ 1.0 ;1.0=3FF0000000000000h
two    DQ 2.0
ln2    DQ 0.69314718055994530942
sqrt2  DQ 1.41421356237309504880
ExpMsk DQ 7FF0000000000000h ;ExpMsk«ê¦n¤]¬O¥¿µL­­¤j
ManMsk DQ 000FFFFFFFFFFFFFh
HidBit DQ 0010000000000000h ;²Ä52¦ì¤¸¡A¥¿³W¤Æ¼ÆªºÁô§t¦ì¤¸
start:  movq    r8,xmm0
        movq    r9,xmm0
;Àˬdx¬O§_¬°0(¥]§t-0)©Î­t¼Æ(¥]§t-¡Û¡B­tNaN)
        or      r8,r8
        jg      posi      ;­Y¬°¥¿¼Æ¡B¥¿µL­­¤j¡B¥¿NaN¡A¸õ¦Üposi¡F
inval:  xor     rax,rax   ;­Y¬°­t¼Æ©Î0¡A«h¨ÏRAXÅܬ°0¡A°h¥Xln°Æµ{¦¡
        jmp     exit2
;¨ì¦¹¤w¹LÂo±¼­t­È»P¹s¡A¥ýÀˬdx¬O§_¬°¥¿NaN¡A¦AÀˬd¬O§_¬°+¡Û
posi:   ucomisd xmm0,xmm0
        jp      inval     ;­YPF=1¡A¥Nªíx=+NaN
        cmp     r8,ExpMsk ;Àˬdx¬O§_¬°+¡Û
        je      exit1

;¨ì¦¹¡Ax¬°¤j©ó¹sªº¥¿³W¤Æ¼Æ©Î¤j©ó¹sªº«D¥¿³W¤Æ¼Æ
        and     r8,ExpMsk ;R8=«ü¼Æ°¾²¾¼Æ
        jnz     normal

;³B²z«D¥¿³W¤Æ¼Æ
        mov     r8,-1022
nxtbit: test    r9,HidBit ;Àˬd¦³®Ä¼Æªº²Ä52¦ì¬O§_¬°1
        jnz     done      ;¦pªG¶}ÀYÅÜ1¤F¡A¥Nªí¥¿³W¤Æ§¹¦¨
        shl     r9,1      ;¦³®Ä¼Æ¥ª²¾1¦ì
        dec     r8        ;«ü¼Æ´î 1
        jmp     nxtbit

;³B²z¥¿³W¤Æ¼Æ¡Gx=m¡Ñ2^p¡A­pºâ«ü¼Æp¡A¨Ã¦s©óR8
normal: shr     r8,52
        and     r9,ManMsk ;R9=¦³®Ä¼Æ
        sub     r8,1023   ;R8=p

;­pºâ¦³®Ä¼Æ¡Am¡A¨Ã¦s©óXMM2
done:   or      r9,one    ;¥¿³W¤Æ¡A¨ÏR9=m=1.xxxx
        movq    xmm3,r9
        movq    xmm2,r9   ;XMM2=m¡Amªº½d³ò¦b[1.0, 2.0)
        cmpsd xmm3,sqrt2,6;­Ym¤j©ósqrt2¡A«hm=m/2¥Bp=p+1³o¼Ë¥i¥HÅý
        movq    rax,xmm3  ;y§ó±µªñ0¡A¤j´T¥[§Ö®õ°Ç¯Å¼Æ¦¬Àijt«×
        or      rax,rax
        jz      lt_sq2
        inc     r8        ;p=p+1
        divsd   xmm2,two  ;m=m/2

lt_sq2: cvtsi2sd xmm1,r8  ;XMM1=p
        subsd   xmm2,one  ;XMM2=y
        mulsd   xmm1,ln2  ;XMM1=p*ln 2

;­pºâln m=ln(1+y)=y*(1-y*(0.5-y*(0.333..-y*(0.25-y*(0.2-y*(0.166..-y*(0.142....)))))))
        movsd   xmm3,xmm2
        xorpd   xmm3,SignMsk    ;XMM3=-y
        lea     r8,coeff
        movsd   xmm0,QWORD PTR [r8]
        mov     rcx,LENGTHOF coeff-1
next:   add     r8,8
        mulsd   xmm0,xmm3
        addsd   xmm0,QWORD PTR [r8]
        loop    next
        mulsd   xmm0,xmm2 ;XMM0=ln m
        addsd   xmm0,xmm1 ;XMM0=ln x=ln m + p*ln 2
exit1:  mov     rax,1
exit2:  ret
ln      ENDP
;----------------------------------------------------------------------------------------
main    PROC
        call    GetCommandLine
;§ä¨ì²Ä¤@­Ó°Ñ¼Æ©Ò¦b¦ì§}¡A¤èªk¬O¨C­Ó°Ñ¼Æ«e³£¦³ªÅ¥Õ¦r¤¸
nxtchr: cmp     BYTE PTR [rax],22h
        je      quot
        cmp     BYTE PTR [rax]," "
        je      cvt2d
q_exit: inc     rax
        jmp     nxtchr
quot:   inc     rax     ;³B²z¨â­Ó"¤§¶¡ªº¦r¤¸
        cmp     BYTE PTR [rax],22h
        jne     quot
        cmp     BYTE PTR [rax],0
        jz      hint
        jmp     q_exit
cvt2d:  invoke  strtod,rax,ADDR endptr ;±N°Ñ¼ÆÂà´«¦¨Âùºë½T«×¯BÂI¼Æ
        mov     r8,endptr
        cmp     BYTE PTR [r8],0 ;­Y[R8]¤£¬°0¡Aªí¥Ü¨Ï¥ÎªÌ¿é¤J¤F«D¼Æ¦r¦r¤¸
        jz      calc
hint:   lea     rcx,szHint
        jmp     pnt_it
calc:   movq    number,xmm0
        call    ln
        or      rax,rax         ;­YRAX=0¡Aªí¥Ü¿é¤J¹s©Î­t­È
        jnz     ok
        lea     rcx,szErr
        jmp     pnt_it
ok:     movq    r8,xmm0
        mov     rdx,number
        lea     rcx,szFmt
pnt_it: call    printf
        invoke  ExitProcess,0
main    ENDP
;****************************************************************************************
END

±N¥¦Àx¦s¦¨ LN.ASM ¤§«á¡A¶i¤J©R¥O´£¥Ü¦r¤¸¡A¨Ì¾Ú«e­±´£¹Lªº¤èªk²ÕĶ¡A¨Ã¦b©R¥O´£¥Ü¦r¤¸¤U°õ¦æ¡C©³¤U»¡©ú LN.ASM¡C

ln °Æµ{¦¡

ln °Æµ{¦¡¥u¦³¤@­Ó°Ñ¼Æ¡A¦Ó¥B¦¹°Ñ¼Æ¬°Âùºë½T«×¯BÂI¼Æ¡A¨Ì·Ó x64 ©I¥sºD¨Ò¡A¥Dµ{¦¡¶·±N¦¹°Ñ¼Æ¦s©ó XMM0 ¶Ç»¼µ¹ ln¡C¶i¤J ln ¤§«á¡A­º¥ý§â¦s©ó XMM0 ªº°Ñ¼Æ¦s¤J°ïÅ|¡A§Y¼v¤lªÅ¶¡¡]²Ä 23 ¦æ¡^¡C

±µ¤U¨Ó¬O¸õÅD«ü¥O¡A¸õ¦Ü start: ¼Ð°O³B¡C¦b JMP »P start: ¼Ð°O³B¡A¦s©ñªº¬O ln »Ý­n¥Î¨ìªº±`¼Æ¸ê®Æ¡C¤]¶·¦³¤H·|°Ý¡A¬°¦ó¤£§â³o¨Ç¸ê®Æ©ñ¦b .DATA ©Î .CONST µ¥¸ê®Æ°Ï¬q¡A«o­n³o¼Ë¦w±Æ¡H³o¬O¦]¬°¡A©¹«á¤p¤ì°¸¥´ºâ±N ln °Æµ{¦¡¿W¥ß¥X¨Ó¡A»s§@¦¨ DLL ÀÉ¡A¨Ñ¨ä¥LÀ³¥Îµ{¦¡©I¥s¡C¬°¤F±N¨ä«Ê¸Ë°_¨Ó°µ¦¨¡u¶Â½c¡v¡A·N«ä¬O¥u­nµ¹ ln °Ñ¼Æ¥¦´N¯à­pºâ¥X¦ÛµM¹ï¼Æ¡A»P¨ä¥L¥~¦bÀô¹ÒµLÃö¡A©Ò¥H¤~§â³o¨Ç±`¼Æ©ñ¦b .CODE °Ï¬q¤º¡C

¦]¬°¹ï¼Æªº©w¸q°ì¤£¥i¬O­t¼Æ©Î¹s¡A©Ò¥H±µ¤U¨Ó­nÀˬd°Ñ¼Æ¬O§_¬°­t¼Æ©Î¬O¹s¡A¦pªG¬O´NÀ³¸Ó¨Ï RAX Åܬ°¹s¨Ã°h¥X ln °Æµ{¦¡¡C¦AªÌ¡AIEEE 754 ©w¸q¤F´XºØ¯S®íªº¸ê®Æ¡A¨Ò¦p«D¼Æ­È¡]NaN¡^¡B¥¿­tµL­­¤j¡B­t¹s»P¥¿¹s¡A¤]»Ý¯S§O³B²z¡A¤À¦¨©³¤U´XºØ±¡ªp¡G

⑴¡B²Ä 43 ¦æªº OR «ü¥OÀˬd¦s©ñ¦b R8 ªº°Ñ¼Æ¬O§_¬°­t¼Æ©Î¹s¡]«e¨â¦æ¤w±N¨Ï¥ÎªÌ¿é¤Jªº°Ñ¼Æ·h²¾¦Ü R8¡^

        or      r8,r8
        jg      posi    ;­Y¬°¥¿¼Æ¡A¸õ¦Üpass¡F

³o¨â¦æ«ü¥O¥Î±o¬Û·íºë§®¡A¶È¨â¦æ´N¯àÀˬd°Ñ¼Æ¬O§_¬°¥¿­È¡CÁÙ°Oªº JG «ü¥O­nµo¥Í¸õÅDªº±ø¥ó¡A¥²¶·¬O ZF=0 ¥B SF=OF¡C¦pªG°Ñ¼Æ¬O 0¡A°õ¦æ¡uOR R8,R8¡v«á¡AZF=1¡A¦]¦¹¤£·|¸õÅD¡F¦pªG°Ñ¼Æ¬O­t¼Æ¡]¥]§t­tµL­­¤j¡B­t¹s¡B­t¼Æ¡B-NaN¡^¡A¨º»ò²Å¸¹¦ì¤¸¬O¤@¡A°õ¦æ OR «á SF ¬°¤@¡A¦ý¬O°õ¦æ OR «ü¥O«á¤£½×µ²ªG¦p¦ó¡A¥²©w²M°£ OF¡A¬G SF ¥²¤£µ¥©ó OF¡A¤£·|¸õÅD¡C©Ò¥Hºî¦X¨Ó¬Ý¡A¥u¦³¥¿ªº¯BÂI¼Æ¡]¥]§t¥¿µL­­¤j¡B¥¿ NaN¡B¤@¯ë¥¿¼Æ¡^¡A¤~·|¸õÅD¦Ü posi: ³B¡C

ºî¦X¤W­z»¡©ú¡A·í°Ñ¼Æ¬O¹s¡]¨ä¹ê¹s©M¥¿¹sªº IEEE 754 ½s½X¬Û¦P¡^¡B­tµL­­¤j¡B­t¹s¡B­t¼Æ¡B-NaN ³£·|¹LÂo±¼¡C³o´XºØ±¡§Î¡A³£À³§â RAX ³]¬° 0¡Aªí¥Ü¿é¤Jªº°Ñ¼Æ¬OµL®Äªº¡C

⑵¡B³q¹L⑴¤§«áªº°Ñ¼Æ¡AÁÙ¦³¥¿ªº«D¼Æ­È¡]+NaN¡^©Î¥¿µL­­¤j¥²¶·¹LÂo±¼¡A¦ý³o¨âºØ±¡§Î¤£¦P¡C¥ý»¡ +NaN¡A¥i¥H¥Î UCOMISD °£±¼ +NaN¡]²Ä 48 ¦æ¡^¡C¦pªG°Ñ¼Æ¬O +NaN¡AÀ³§â RAX ³]¬° 0¡Aªí¥Ü¿é¤Jªº°Ñ¼Æ¬OµL®Äªº¡C

⑶¡B²Ä 50 ¦æ¡AÀˬd°Ñ¼Æ¬O§_¬°¥¿µL­­¤j¡A³o¹D«ü¥O¨S¦³¯S§O¤§³B¡A´N¥u¬O§â°Ñ¼Æ»P¥Nªí¥¿µL­­¤jªº¤Q¤»¶i¦ì¼Æ­È¡]¦¹¼Æ­È¬O 7FF0000000000000h¡^¤ñ¸û¡A¦pªG¬Û¦P¡A´N¥Nªí°Ñ¼Æ¬°¥¿µL­­¤j¡C¦]¬°¥¿µL­­¤j¨ú¹ï¼Æ­È¡A¤]¬O¥¿µL­­¤j¡A¨Ã«DµL®Äªº°Ñ¼Æ¡A¦ý«o¤]¤£¥²¥h­pºâ¡AÀ³ª½±µ±N RAX ³]¬°¤@¡A¥B¨Ï XMM0 «O«ù­ì¨Óªº¥¿µL­­¤jªð¦^§Y¥i¡C

⑷¡B¦pªG¯à°õ¦æ¨ì²Ä 53 ¦æ¡Aªí¥Ü¿é¤Jªº°Ñ¼Æ¬°¤@¯ë¥¿¼Æ¡A¦Ó¥B¤£¬O +NaN¡A¤]¤£¬O¥¿µL­­¤j¡C¤@¯ë¥¿¼Æ¥i¯à¬O¥¿³W¤Æ¼Æ¡A¤]¥i¯à¬O«D¥¿³W¤Æ¼Æ¡A­pºâ¥¦­Ìªº¹ï¼Æ­È¹Lµ{¤£¤Ó¤@¼Ë¡A¦]¦¹²Ä 54 ¦æ§PÂ_¬O¥¿³W¤Æ¼ÆÁÙ¬O«D¥¿³W¤Æ¼Æ¡A¦pªG¬O¥¿³W¤Æ¼Æ¡A´N¸õÅD¦Ü²Ä 66 ¦æ¡A¨Ì¾Ú¤W­±´£¹Lªº¹ï¼Æ«ß¡B³Ì¨Î¤Æ¡B¥H¯³¤E»àºâªk­pºâ®õ°Ç®i¶}¦¡¡A«K¥i¨D¥X¦ÛµM¹ï¼Æ¡C

¦pªG¬O«D¥¿³W¤Æ¼Æ¡A¹Lµ{µyµy¤£¦P¡A³o¨à´N»¡»¡¦p¦ó­pºâ«D¥¿³W¤Æ¼Æªº¦ÛµM¹ï¼Æ¡C

«D¥¿³W¤Æ¼Æ

²Ä¤Q¤@³¹´£¹L¡A¤£½×¬O³æºë½T«×ÁÙ¬OÂùºë½T«×¯BÂI¼Æ¡A¨ä®æ¦¡§¡¤À¬°¤T³¡¤À¡G³Ì°ªªº¤@­Ó¦ì¤¸¬O²Å¸¹¦ì¤¸¡]sign¡^¡B¨ä¦¸¬O«ü¼Æ°¾²¾­È¡]exponent bias¡^¡B³Ì«á¬O¦³®Ä¼Æ¦r¡]significand¡^¡C¹ïÂùºë½T«×¯BÂI¼Æ¨Ó»¡¡A¨ä®æ¦¡¬°¯BÂI¼Æªº¼Æ­È¤j¤p¬°

 (-1)sign¡Ñ1.significand¡Ñ2exponent

¤W­±ªº exponent µ¥©ó«ü¼Æ°¾²¾­È´î 3FFh ©Î 7Fh¡]¹ïÂùºë½T«×¦Ó¨¥¬O 3FFh¡A§Y¤Q¶i¦ì 1023¡F¹ï³æºë½T«×¦Ó¨¥¬O 7Fh¡A§Y¤Q¶i¦ì 127¡^¡C¦¹¥~ 1.significand ¤¤ªº 1 ºÙ¬°Áô§t¾ã¼Æ¡A¥¦¥i¨Ïºë½T«×¦h¤@¦ì¡C±Ä¥Î³o¼Ëªº¤èªkªí¥Üªº¼Æ­È¡AºÙ¬°¥¿³W¤Æ¼Æ¡]normal number¡^¡A©Ò¥H¥¿³W¤Æ¼Æªº©w¸q¬O«ü¼Æ°¾²¾­È¬J¤£¬O¥þ³¡³£¬O¹s¡B¤]¤£¬O¥þ³¡³£¬O¤@¡A¨Ã¥B¨ã¦³¤@¦ìÁô§t¾ã¼Æ¡A¨ä­È¬O 1¡C

¹ïÂùºë½T«×¯BÂI¼Æ¦Ó¨¥¡A¥i¥H±À½×¥X³Ì¤jªº¥¿³W¤Æ¼Æ¬O 7FEF FFFF FFFF FFFFh¡A´«ºâ¦¨¹ê»Ú¼Æ­È¬O 1.111¡K¡K1¡Ñ27FE-3FF ≈ 1.798¡Ñ10308¡]1.111¡K¡K1 ¬O¤G¶i¦ì¡A¤p¼ÆÂI«á¦@ 52 ­Ó 1¡^¡F¦Ó³Ì¤p­È¬O 0010 0000 0000 0000h¡A´«ºâ¦¨¹ê»Ú¼Æ­È¬O 1.0¡Ñ21-1023 ≈ 2.225¡Ñ10-308¡C

°²¦p§â³o­Ó³Ì¤pªº¥¿³W¤Æ¼Æ°£¥H 2¡Aµ²ªG«ü¼Æ°¾²¾­È·|Åܬ°¹s¡AµLªk¥Î¥¿³W¤Æ¼Æªí¥Ü¡A¦pªG±Ë±óÅܦ¨¹s¡A´NÅܱo«Ü©_©Ç¡A¹³³o¼Ëªº±¡§Î¥s¬ðµM¤U·¸¡]abrupt underflow¡^¡C«D¥¿³W¤Æ¼Æ´N¬O¬°¤F¸Ñ¨M³o¼Ëªº°ÝÃD¡AÀ³¹B¦Ó¥Íªº¡C«D¥¿³W¤Æ¼Æ¬O«ü¦³®Ä¼Æ¦r¤£¥þ¬O¹s¡A¦Ó¥B«ü¼Æ°¾²¾­È¬°¹s¡A¨Ã¥BÁô§t¤@¦ì¾ã¼Æ¡A¨ä­È¬O 0¡C«D¥¿³W¤Æ¼Æªº«ü¼Æ¬O©T©w­È¡A¹ïÂùºë½T«×¯BÂI¼Æ¦Ó¨¥¡A«ü¼Æ¬O ¡Ð1022¡F¹ï³æºë½T«×¯BÂI¼Æ¦Ó¨¥¡A«ü¼Æ¬O ¡Ð126¡C°£¤F«ü¼Æ©T©w¤§¥~¡A«D¥¿³W¤Æ¼ÆªºÁô§t¾ã¼Æ¬O¹s¡A¤£¬O¤@¡C

®Ú¾Ú«D¥¿³W¤Æ¼Æªº³W«h¡A¹ïÂùºë½T«×¯BÂI¼Æ¦Ó¨¥¡A³Ì¤jªº«D¥¿³W¤Æ¼Æ¬O 000F FFFF FFFF FFFFh¡A´«ºâ¦¨¹ê»Ú¼Æ­È¬O 0.111¡K¡K1¡Ñ2-1022 ≈ 2.225¡Ñ10-308¡]0.111¡K¡K1 ¬O¤G¶i¦ì¡A¤p¼ÆÂI«á¦@ 52 ­Ó 1¡^¡C¥¦¤ñ³Ì¤pªº¥¿³W¤Æ¼Æµy·L¤p¤@ÂI¡A¤]´N¬O»¡¡A¥¦±µÄòµÛ³Ì¤pªº¥¿³W¤Æ¼Æ©¹¹sªº¤è¦VÄ~ÄòÅܤp¡C·í­pºâµ²ªG¤p©ó³Ì¤p¥¿³W¤Æ¼Æ®É¡A¤£¬OÀþ¶¡Åܬ° 0¡A¦Ó¬O³vº¥¡u¬y¡v¦V 0¡A«D¥¿³W¤Æ¼Æ¨Ó«O¯dºÉ¥i¯à¦hªººë½T«×¡A³o¼Ëªº±¡§ÎºÙ¬°º¥¶i¤U·¸¡]gradual underflow¡^¡C

¶¶±a´£¤@´£¡A¹ïÂùºë½T«×¯BÂI¼Æ¦Ó¨¥¡A³Ì¤pªº«D¥¿³W¤Æ¼Æ¬O 0000 0000 0000 0001h¡A´«ºâ¦¨¹ê»Ú¼Æ­È¬O 0.000¡K¡K01¡Ñ2-1022 = 2-52¡Ñ2-1022 ≈ 4.941¡Ñ10-324¡C¨ä¤¤ 0.000¡K¡K01 ¬O¤G¶i¦ì¡A¤p¼ÆÂI«á¦@ 51 ­Ó 0¡A¥u¦³²Ä¹s¦ì¤¸¬O 1¡C

ÁA¸Ñ¤F«D¥¿³W¤Æ¼Æ¤§«á¡A´N¯à­pºâ¤F¡C°Ñ¦Ò¥k¹Ï¡A°²³]¦³­Ó«D¥¿³W¤ÆÂùºë½T«×¯BÂI¼Æ¡A¨ä½s½X¬° 0001 C000 0000 0000h¡A¹Ï¤¤¦³®Ä¼Æ¦r¬O¥H¶À¦â©Mµµ¦âªí¥Ü¡A¶À¦â¥Nªí 0¡Aµµ¦â¥Nªí 1¡C¹Ï¤¤¦³®Ä¼Æ¥H¤G¶i¦ìªí¥Ü¬O 0.000111000¡K¡K0¡]1 «á­±¦³ 46 ­Ó 0¡^¡A¬°¤F­n²Å¦X®õ°Ç®i¶}¦¡­pºâ ln m ¤¤¡Am ¶·¦b 1 »P 2 ¤§¶¡¡A©Ò¥H¥²¶·§â¹Ï¤¤ªº¦³®Ä¼Æ©¹¥ª²¾ 4 ­Ó¦ì¤¸¡CÁÙ°O±o¨C©¹¥ª²¾¤@­Ó¦ì¤¸¡A¬Û·í©ó­¼¥H¤G¡A¦ý¤S±o¨Ï m ºû«ù¤£ÅÜ¡F¦pªG¨Ï 2 ªº¾­¦¸¤è´î¤@¡A´N¯à¹F¦¨¥Øªº¡C­ì©l½X²Ä 57¡ã63 ¦æ«K¬O³B²z³o¨Æ¡C

¸g¥Ñ²Ä 57¡ã63 ¦æ±o¨ì«D¥¿³W¤Æ¼Æªº«ü¼Æ»P m «á¡A´N¥i¥H¨Ö¤J­pºâ¥¿³W¤Æ¼Æªºµ{¦¡¤¤¡A°õ¦æ³Ì¨Î¤Æ¡B¦A¥H¯³¤E»àºâªk­pºâ®õ°Ç®i¶}¦¡¡A«K¥i¨D¥X¦ÛµM¹ï¼Æ¡C

±o¨ì°Ñ¼Æ

LN.EXE °õ¦æ¤è¦¡»P«e­±ªº¨Ò¤l³£¤£¬Û¦P¡C·í¨Ï¥ÎªÌ¦b©R¥O´£¥Ü¦r¤¸¤¤°õ¦æ LN.EXE ®É¡A¥²¶·­n¦bÀ³¥Îµ{¦¡¤§«á¿é¤J¤@­Ó¥¿¼Æ¡A¹³¤U­±¨º¼Ë¡A©Ò¿é¤Jªº¥¿¼Æ¤@¯ëºÙ¬°°Ñ¼ÆÀò¿ï¶µ¡G

E:\HomePage\SOURCE\Win64\CONSOLE>ln 57.3

³o¼Ëªº¨Ï¥Î¤è¦¡¡A´N¦n¹³¼Æ¾Ç®a¦b¯È¤W­pºâ 57.3 ªº¦ÛµM¹ï¼Æ¤@¼Ë¡A¼g¡uln 57.3¡v¡C¡uln 57.3¡vºÙ¬°©R¥O¦r¦ê¡A¦Ó¦¹³Bªº 57.3 ¨Ã«D¥H¯BÂI¼Æ®æ¦¡¦s¦b°O¾ÐÅ餺¡A¦Ó¬O¥H¼Æ¦r¦r¦ê¤è¦¡¦s©ó°O¾ÐÅ餤¡C¨º»ò¡A­n«ç»ò¼Ë¤~¯à§â¼Æ¦r¦r¦êªº¡u57.3¡v¡AÅܦ¨¯BÂI¼Æªº¡u57.3¡v©O¡H¤j¬ù¦³©³¤U¤T­Ó¨BÆJ¡G

  1. ©I¥s GetCommandLine ±o¨ì©R¥O¦r¦ê¦ì§}¡C
  2. §ä¨ì¼Æ¦r¦r¦ê¦ì§}¡]²Ä 103¡ã115 ¦æ¡^¡C
  3. ©I¥s strtod ±N¼Æ¦r¦r¦êÂà´«¦¨¯BÂI¼Æ¡C

²Ä¤@¨B¤Î²Ä¤T¨B«Ü®e©ö°µ¨ì¡A¦ý²Ä¤G¨B´N¦³¨Ç³Â·Ð¡C¦pªG¥J²Ó·Q·Q¡A«K¥i¥H·Q±o¨ì¡A°Ñ¼Æ»PÀ³¥Îµ{¦¡¦WºÙ¤§¶¡¥HªÅ¥Õ¦r¤¸¹j¶}¡A©Ò¥H±q²Ä¤@¨B±o¨ì©R¥O¦r¦ê¦ì§}«á¡A«K¥i¸g¥Ñ·j´MªÅ¥Õ¦r¤¸¦Ó±o¨ì°Ñ¼Æ©Ò¦b¦ì§}¡C¦ý¤£©¯ªº¬O¡A²z·Q«ÜÂ׺¡¡A²{¹ê«Ü°©·P¡A¤Z¨ÆÁ`¦³¨Ò¥~¡C¦b³oùتº¨Ò¥~¡Aµo¥Í¦b°²¦p LN.EXE ¤£¦b·í«e¥Ø¿ýùØ¡A¦Ó¦b¦³ªÅ¥Õ¦r¤¸ªº¥Ø¿ý¤¤¡CÁ|­Ó¨Ò¤l»¡©ú¡A°²¦p LN.EXE ¦b¡uE:\MY APP\LN.EXE¡v¡A¦Ó·í«e¥Ø¿ý¬O¡uD:\MATH¡v¡A¨º»ò­n°õ¦æ LN.EXE ®É¡A¥i¥H¹³¤U­±¨º¼Ë¡G

D:\MATH>
D:\MATH>E:\"MY APP"\LN 57.3

¥Ø¿ý¦W§t¦³ªÅ¥Õ¦r¤¸®É¡A¦b¨Ï¥Î¸Ó¥Ø¿ý¦WºÙ®É¡A¥²¶·¥Î¤@¹ï " " ±N¥Ø¿ý¦WºÙ¬A¦í¡A´N¹³¤W­±¨º¼Ë¡C³o®É­Ô´N¤£¯à³æ³æ¥u­n¬O§ä¨ìªÅ¥Õ¦r¤¸¡A´N»{¬°«á­±±µµÛªº´N¬O°Ñ¼Æ¡A¦ý«e­±¤]»¡¤F¡A¦pªG¬O¦b¤@¹ï " " ¤ºªºªÅ¥Õ¦r¤¸¡A´N¤£¬O¥Î¨Ó¹j¶}°Ñ¼Æªº¦Ó¬O¥Ø¿ý¦WºÙªº¤@³¡¥÷¡C­ì©lµ{¦¡ªº²Ä 103¡ã115 ¦æ´N¬OÂǥѳo¼Ëªº¤ÀªR¡A¦Ó¼¶¼g¥X¨Óªº¡C


µùÄÀ

µù¤@¡G¦P¦ìºX¼Ð¡]Parity Flag¡^»P x64 «ü¥O¡GJP/JPE¡BJNP/JPO

¦P¦ìºX¼Ð¤]ºÙ¬°©_°¸ºX¼Ð¡A¥¦¦ì©ó©µ¦ùºX¼Ð¼È¦s¾¹ªº²Ä¤G­Ó¦ì¤¸¡A²ºÙ PF¡A¦­¦b 8086/8088 CPU ´N¤w¨Ï¥Î¦¹¦ì¤¸¡G¹Bºâªºµ²ªG´«¦¨¤G¶i¦ì«á¡A³Ì§Cªº¤K­Ó¦ì¤¸¤¤¡A­Y¦³°¸¼Æ­Ó 1¡A«h¦¹¦ì¤¸³]¬° 1¡A¤Ï¤§¬° 0¡C

¨Ò¦p©³¤Uªº¨Ò¤l¡G

        mov     cx,103h
        or      cx,cx

¹Bºâ«á CX=0000 0001 0000 00011b¡A³Ì§Cªº¤K­Ó¦ì¤¸¤¤¥u¦³¨â­Ó¦ì¤¸¬O¤@¡A¦]¦¹ CPU ·|§â¦P¦ìºX¼Ð³]¬°¤@¡C

JP/JPE¡BJNP/JPO ¬O x64 «ü¥O¡AJP »P JPE ¬O¬Û¦Pªº«ü¥O¡A«eªÌ¬O Jump short if parity¡A«áªÌ¬O Jump short if parity even¡A¨âªÌ³£¬O·í¦P¦ìºX¼Ð¬°¤@®É¡Aµo¥Í¸õÅD¡CJNP »P JPO ¤]¬O¬Û¦Pªº«ü¥O¡A«eªÌ¬O Jump short if not parity¡A«áªÌ¬O Jump short if parity odd¡A¨âªÌ³£¬O·í¦P¦ìºX¼Ð¬°¹s®É¡Aµo¥Í¸õÅD¡CJP »P JNP ªº»yªk¬O¡G

JP      ¼Ð°O
JNP     ¼Ð°O

¼Ð°O¡]label¡^¬O¤@¦ê­^¤å¦r²Õ¦¨¡A¤]¥i¥H¥]§t¡u_¡v¡Bªü©Ô§B¼Æ¦r¡A¥²¶·¥H¡u:¡vµ²§À¡A¥¦¥NªíµÛ¦ì§}¡C¨Ò¦p©³¤Uªº¨Ò¤l¡G

        mov     r8d,103h
        inc     r8d
        jnp     ok
         ⁝
ok:

°õ¦æ§¹ INC «á¡AR8D ªº 32 ­Ó¦ì¤¸ùئ³¨â­Ó¦ì¤¸¬O¤@¡A¦ý²Ä 0¡ã7 ¦ì¤¸¥u¦³²Ä¤G­Ó¦ì¤¸¬O¤@¡]©_¼Æ­Ó¤@¡^¡A¨ä¥L¤C­Ó¦ì¤¸³£¬O¹s¡A¦]¦¹ INC ·|§â¦P¦ìºX¼Ð²M°£¡A¬G°õ¦æ JNP ®É¡A·|µo¥Í¸õÅD¦Ü ok: ¼Ð°O³B¡C

¦b¬Y¨Ç°£¿ù¾¹¡]¨Ò¦p DOS ªº DEBUG ©Î SYMDEB¡^¤¤¡A¥HÁY¼gªí¥Ü¦P¦ìºX¼Ðªºª¬ºA¡G­Y PF ³Q³]©wÅܬ° 1¡AÅã¥Ü PE¡]parity even ªºÁY¼g¡Aªí¥Ü°¸®ÕÅç¡^¡F­Y PF ³Q²M°£Åܬ° 0¡AÅã¥Ü PO¡]parity odd ªºÁY¼g¡Aªí¥Ü©_®ÕÅç¡^¡C

¦P¦ìºX¼Ðªº³]­pªì°J«D±`²³æ¡A¬O¬°¤F¤Ï¬M¹Bºâµ²ªGªº¡u³Ì§C¤K­Ó¦ì¤¸¡v¤¤¡A1 ªº­Ó¼Æ¬O§_¬°°¸¼Æ¡C³oºØ±¡§Î³Ì±`¥Î©ó¦­´Áªº¸ê®Æ³q°T¡]¦p RS-232 ¦ê¦C°ð¡^¤¤¡A¥i¥Î¨Ó§Ö³t­pºâ¸ê®Æªº®ÕÅç¦ì¤¸¡A¥HÀˬd¶Ç¿éªº¥¿½T©Ê¡C¦ý¦p¤µ¡A¤j¦h¼Æ¸ê®Æ¶Ç¿é³£¥ÑµwÅéÀËÅç¡]¦p USB¡BPCIe¡BSATA¡^¡F¦Óºô¸ô³q°T¤]¤w¤º«Ø§ó±j¤jªº°»¿ù¾÷¨î¡]¦p CRC¡BChecksum¡^¡A¨Ã¥B¤]¥æ¥Ñ±M¥ÎµwÅé§¹¦¨¡C¦]¦¹¡A¤@¯ëÀ³¥Îµ{¦¡¶}µoªÌ´X¥G¤£»Ý­n¦A¥Î¦P¦ìºX¼Ð¨ÓÀËÅç¸ê®Æ¥¿½T»P§_¡C

¾¨ºÞ¦P¦ìºX¼Ðªº­ì©l¥Î³~¤w¦¡·L¡A¦ý¬O­^¯Sº¸«o½á¤©¤F¥¦¤@­Ó­«­nªº¡u²Ä¤G±Mªø¡v¡A¨º´N¬O±Mªù¥Î¨Ó°»´ú¯BÂI¼Æ¹Bºâ¤¤ªº NaN¡C·í UCOMISD ©Î UCOMISS ªº¹Bºâ¤¸¤¤¡A¦³¥ô¦ó¤@­Ó¬O NaN ¨º»ò´N·|³]©w¦P¦ìºX¼Ð¡A¤§«áÀ³¥Îµ{¦¡¥i¥H§Q¥Î JP ©Î JNP ¸õÅD¦Ü¬Y³B¡A¥h³B²z NaN ªº±¡§Î©Î¤£¬O NaN ªº±¡§Î¡C