找回密码
 欢迎注册
楼主: 无心人

[讨论] 二进制32位整数快速平方根

[复制链接]
 楼主| 发表于 2009-2-11 17:43:27 | 显示全部楼层
  1. __declspec(naked)
  2. DWORD __fastcall iSqrt_SSE41(DWORD n)
  3. {
  4. __asm
  5. {
  6. mov eax, ecx
  7. and eax, 0x80000000
  8. movd xmm0, eax
  9. psllq xmm0, 32
  10. mov eax, 0
  11. cvtsi2sd xmm1, eax
  12. movsd xmm2, qword ptr [b32]
  13. blendvpd xmm1, xmm2, xmm0
  14. cvtsi2sd xmm0, ecx
  15. addsd xmm0, xmm1
  16. sqrtsd xmm0, xmm0
  17. cvttsd2si eax, xmm0
  18. ret
  19. }
  20. }
复制代码
SSE2的无跳转版本不如带跳转的 只好写SSE4.1的代码了 可惜,我查我服务器,只支持到SSSE3 哎 谁可以帮测试下代码正确性? ================================ 由于改进了SSE2版本 所以此版本作废
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-11 19:06:18 | 显示全部楼层

回复 18# 无心人 的帖子

fisttp 是SSE3指令,在我的VC6.0下不能通过编译,即使通过编译也不能运行。我的电脑是PIV2.6. 以下的内容转自:http://blog.csdn.net/housisong/archive/2007/05/19/1616026.aspx
SSE3增加了一条FPU取整指令fisttp,和fistp指令功能几乎相同(我的电脑上经过测试速度也相同),但默认向0取整,和RC场设置无关,所以使用fisttp的代码就可以不管RC场了,有利于简化代码和优化性能
在上文中,作者还是先了使用 fistp 指令的浮点转化整数的版本,无心人可否尝试一下。看看速度如何,另外,这样的版本也可以在我的PIV电脑上测试。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-11 19:20:03 | 显示全部楼层
呵呵 我没注意, 我还以为是P6以后都支持呢 另外,下午的程序写糊涂了 并没这么复杂
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-11 19:23:33 | 显示全部楼层
  1. double b32[] = {0.0, 4294967296.0};
  2. __declspec(naked)
  3. DWORD __fastcall iSqrt_SSE2(DWORD n)
  4. {
  5. __asm
  6. {
  7. mov eax, ecx
  8. and eax, 0x80000000
  9. shr eax, 31
  10. movsd xmm1, qword ptr [b32 + eax * 8]
  11. cvtsi2sd xmm0, ecx
  12. addsd xmm0, xmm1
  13. sqrtsd xmm0, xmm0
  14. cvttsd2si eax, xmm0
  15. ret
  16. }
  17. }
复制代码
这么做就能避免跳转了 至于fisttp,我想控制RC可能有点复杂, 呵呵
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-11 19:40:08 | 显示全部楼层
测试了3个版本:UintSqrt,iSqrt_FPU 和 sqrt_ref, 在我的电脑上运行2^28(从1到2&28-1)次,其速度如下 iSqrt_FPU: 4375 ms UintSqrt: 8406 ms sqrt_ref: 16328 ms 说明: 1. UintSqrt为我编写的使用bsr的c语言版本,略有修改 2. sqrt_ref的代码如下: DWORD sqrt_ref(DWORD n) { DWORD r=(DWORD)(sqrt(double(n))); return r; } 3.iSqrt_FPU 函数修改了一条指令,将FISTTP 改为FISTP 综上所述, 1. 系统提供的函数最慢. 2. iSqrt_FPU 目前是个错误的版本,将其修正,使其在PIV上正确运行,需要增加几条指令,将会使得速度变慢. 3. 如果UintSqrt改为汇编优化,速度应可以提高,但提上的幅度应该不会太大.在2^28以内是否会超过修正后的iSqrt_FPU仍是个未知数. 另外,限于我的VC环境,你的使用 SSE2指令的版本在我的电脑上没有编译,也就没有办法测试了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-11 19:41:12 | 显示全部楼层
  1. double b32[] = {0.0, 4294967296.0};
  2. __declspec(naked)
  3. DWORD __fastcall iSqrt_FPU_alpha(DWORD n)
  4. {
  5. __asm
  6. {
  7. push ecx
  8. mov eax, ecx
  9. and eax, 0x80000000
  10. fld qword ptr [b32 + eax * 8]
  11. fild dword ptr [esp]
  12. faddp st(1), st
  13. fsqrt
  14. push 0
  15. fnstcw word ptr [esp]
  16. mov edx, dword ptr [esp]
  17. or dword ptr [esp], 0x0C00
  18. fldcw word ptr [esp]
  19. fistp dword ptr [esp + 4]
  20. mov dword ptr [esp], edx
  21. fldcw word ptr [esp]
  22. add esp, 4
  23. pop eax
  24. ret
  25. }
  26. }
复制代码
不用fisttp 多了9条指令 因为无法测试,特取名...FPU_alpha 明天有时间测试 不用__fastcall似乎能节约下ecx和一条指令 ================================ 似乎不用__fastcall也无法避免堆栈上占用两个双字 所以,还是用__fastcall
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-11 23:29:53 | 显示全部楼层
终于将C版改为汇编语言版本了,测试发现,速度仅仅提高约10%,计算2^28次平方根,用时从 7902.3ms 提高到7192.7 ms。 函数原型: extern "C" DWORD __fastcall UintSqrt(DWORD n); 汇编源代码:
  1. .486P
  2. .387
  3. OPTION DOTNAME
  4. _TEXT SEGMENT DWORD PUBLIC FLAT 'CODE'
  5. ALIGN 004H
  6. _TEXT ENDS
  7. _DATA SEGMENT DWORD PUBLIC FLAT 'DATA'
  8. ALIGN 004H
  9. _DATA ENDS
  10. _BSS SEGMENT DWORD PUBLIC FLAT 'BSS'
  11. ALIGN 004H
  12. _BSS ENDS
  13. _RDATA SEGMENT DWORD PUBLIC FLAT 'DATA'
  14. ALIGN 004H
  15. _RDATA ENDS
  16. _TEXT1 SEGMENT DWORD PUBLIC FLAT 'CODE'
  17. ALIGN 004H
  18. _TEXT1 ENDS
  19. _DATA1 SEGMENT DWORD PUBLIC FLAT 'DATA'
  20. ALIGN 004H
  21. _DATA1 ENDS
  22. ASSUME CS:FLAT,DS:FLAT,SS:FLAT
  23. _DATA SEGMENT DWORD PUBLIC FLAT 'DATA'
  24. ALIGN 4
  25. _sqrtTab DB 00H
  26. DB 01H
  27. DB 01H
  28. DB 01H
  29. DB 02H
  30. DB 02H
  31. DB 02H
  32. DB 02H
  33. DB 02H
  34. DB 03H
  35. DB 03H
  36. DB 03H
  37. DB 03H
  38. DB 03H
  39. DB 03H
  40. DB 03H
  41. DB 04H
  42. DB 04H
  43. DB 04H
  44. DB 04H
  45. DB 04H
  46. DB 04H
  47. DB 04H
  48. DB 04H
  49. DB 04H
  50. DB 05H
  51. DB 05H
  52. DB 05H
  53. DB 05H
  54. DB 05H
  55. DB 05H
  56. DB 05H
  57. DB 05H
  58. DB 05H
  59. DB 05H
  60. DB 05H
  61. DB 06H
  62. DB 06H
  63. DB 06H
  64. DB 06H
  65. DB 06H
  66. DB 06H
  67. DB 06H
  68. DB 06H
  69. DB 06H
  70. DB 06H
  71. DB 06H
  72. DB 06H
  73. DB 06H
  74. DB 07H
  75. DB 07H
  76. DB 07H
  77. DB 07H
  78. DB 07H
  79. DB 07H
  80. DB 07H
  81. DB 07H
  82. DB 07H
  83. DB 07H
  84. DB 07H
  85. DB 07H
  86. DB 07H
  87. DB 07H
  88. DB 07H
  89. DB 080H
  90. DB 080H
  91. DB 081H
  92. DB 082H
  93. DB 083H
  94. DB 084H
  95. DB 085H
  96. DB 086H
  97. DB 087H
  98. DB 088H
  99. DB 089H
  100. DB 08aH
  101. DB 08bH
  102. DB 08cH
  103. DB 08dH
  104. DB 08eH
  105. DB 08fH
  106. DB 090H
  107. DB 090H
  108. DB 091H
  109. DB 092H
  110. DB 093H
  111. DB 094H
  112. DB 095H
  113. DB 096H
  114. DB 096H
  115. DB 097H
  116. DB 098H
  117. DB 099H
  118. DB 09aH
  119. DB 09bH
  120. DB 09bH
  121. DB 09cH
  122. DB 09dH
  123. DB 09eH
  124. DB 09fH
  125. DB 0a0H
  126. DB 0a0H
  127. DB 0a1H
  128. DB 0a2H
  129. DB 0a3H
  130. DB 0a3H
  131. DB 0a4H
  132. DB 0a5H
  133. DB 0a6H
  134. DB 0a7H
  135. DB 0a7H
  136. DB 0a8H
  137. DB 0a9H
  138. DB 0aaH
  139. DB 0aaH
  140. DB 0abH
  141. DB 0acH
  142. DB 0adH
  143. DB 0adH
  144. DB 0aeH
  145. DB 0afH
  146. DB 0b0H
  147. DB 0b0H
  148. DB 0b1H
  149. DB 0b2H
  150. DB 0b2H
  151. DB 0b3H
  152. DB 0b4H
  153. DB 0b5H
  154. DB 0b5H
  155. DB 0b6H
  156. DB 0b7H
  157. DB 0b7H
  158. DB 0b8H
  159. DB 0b9H
  160. DB 0b9H
  161. DB 0baH
  162. DB 0bbH
  163. DB 0bbH
  164. DB 0bcH
  165. DB 0bdH
  166. DB 0bdH
  167. DB 0beH
  168. DB 0bfH
  169. DB 0c0H
  170. DB 0c0H
  171. DB 0c1H
  172. DB 0c1H
  173. DB 0c2H
  174. DB 0c3H
  175. DB 0c3H
  176. DB 0c4H
  177. DB 0c5H
  178. DB 0c5H
  179. DB 0c6H
  180. DB 0c7H
  181. DB 0c7H
  182. DB 0c8H
  183. DB 0c9H
  184. DB 0c9H
  185. DB 0caH
  186. DB 0cbH
  187. DB 0cbH
  188. DB 0ccH
  189. DB 0ccH
  190. DB 0cdH
  191. DB 0ceH
  192. DB 0ceH
  193. DB 0cfH
  194. DB 0d0H
  195. DB 0d0H
  196. DB 0d1H
  197. DB 0d1H
  198. DB 0d2H
  199. DB 0d3H
  200. DB 0d3H
  201. DB 0d4H
  202. DB 0d4H
  203. DB 0d5H
  204. DB 0d6H
  205. DB 0d6H
  206. DB 0d7H
  207. DB 0d7H
  208. DB 0d8H
  209. DB 0d9H
  210. DB 0d9H
  211. DB 0daH
  212. DB 0daH
  213. DB 0dbH
  214. DB 0dbH
  215. DB 0dcH
  216. DB 0ddH
  217. DB 0ddH
  218. DB 0deH
  219. DB 0deH
  220. DB 0dfH
  221. DB 0e0H
  222. DB 0e0H
  223. DB 0e1H
  224. DB 0e1H
  225. DB 0e2H
  226. DB 0e2H
  227. DB 0e3H
  228. DB 0e3H
  229. DB 0e4H
  230. DB 0e5H
  231. DB 0e5H
  232. DB 0e6H
  233. DB 0e6H
  234. DB 0e7H
  235. DB 0e7H
  236. DB 0e8H
  237. DB 0e8H
  238. DB 0e9H
  239. DB 0eaH
  240. DB 0eaH
  241. DB 0ebH
  242. DB 0ebH
  243. DB 0ecH
  244. DB 0ecH
  245. DB 0edH
  246. DB 0edH
  247. DB 0eeH
  248. DB 0eeH
  249. DB 0efH
  250. DB 0f0H
  251. DB 0f0H
  252. DB 0f1H
  253. DB 0f1H
  254. DB 0f2H
  255. DB 0f2H
  256. DB 0f3H
  257. DB 0f3H
  258. DB 0f4H
  259. DB 0f4H
  260. DB 0f5H
  261. DB 0f5H
  262. DB 0f6H
  263. DB 0f6H
  264. DB 0f7H
  265. DB 0f7H
  266. DB 0f8H
  267. DB 0f8H
  268. DB 0f9H
  269. DB 0f9H
  270. DB 0faH
  271. DB 0faH
  272. DB 0fbH
  273. DB 0fbH
  274. DB 0fcH
  275. DB 0fcH
  276. DB 0fdH
  277. DB 0fdH
  278. DB 0feH
  279. DB 0feH
  280. DB 0ffH
  281. _DATA ENDS
  282. _TEXT SEGMENT DWORD PUBLIC FLAT 'CODE'
  283. ALIGN 4
  284. PUBLIC _sqrtTab
  285. PUBLIC @UintSqrt@4
  286. @UintSqrt@4 PROC NEAR ; COMDAT
  287. ; _n = ecx
  288. ; if (n<64)
  289. xor eax,eax
  290. cmp ecx, 64
  291. jae SHORT L25237
  292. mov al, BYTE PTR _sqrtTab[ecx]
  293. ret 0
  294. L25237:
  295. push ebx
  296. ; bc=log2(n)/2;
  297. bsr eax, ecx
  298. shr eax, 1
  299. jmp DWORD PTR L25370[eax*4]
  300. L25242:
  301. ; case 3:
  302. ; r=(sqrtTab[n]>>4);
  303. mov al, BYTE PTR _sqrtTab[ecx]
  304. shr eax, 4
  305. ; r1=r+1;
  306. ; if (r1*r1>=n) r++;
  307. lea ebx, DWORD PTR [eax+1]
  308. mov edx, ebx
  309. imul edx, ebx
  310. cmp ecx, edx
  311. sbb eax,-1
  312. pop ebx
  313. ret 0
  314. L25244:
  315. ; case 4:
  316. ; r=(sqrtTab[n>>2]>>3);
  317. mov ebx, ecx
  318. shr ebx, 2
  319. mov al, BYTE PTR _sqrtTab[ebx]
  320. shr eax, 3
  321. ; r1=r+1;
  322. ; if (r1*r1>=n) r++;
  323. lea ebx, DWORD PTR [eax+1]
  324. mov edx, ebx
  325. imul edx, ebx
  326. cmp ecx, edx
  327. sbb eax,-1
  328. pop ebx
  329. ret 0
  330. L25246:
  331. ; case 5:
  332. ; r=(sqrtTab[n>>4]>>2);
  333. mov ebx, ecx
  334. shr ebx, 4
  335. mov al, BYTE PTR _sqrtTab[ebx]
  336. shr eax, 2
  337. ; r1=r+1;
  338. ; if (r1*r1>=n) r++;
  339. lea ebx, DWORD PTR [eax+1]
  340. mov edx, ebx
  341. imul edx, ebx
  342. cmp ecx, edx
  343. sbb eax,-1
  344. pop ebx
  345. ret 0
  346. L25248:
  347. ; case 6:
  348. ; r=(sqrtTab[n>>6]>>1);
  349. mov ebx, ecx
  350. shr ebx, 6
  351. mov al, BYTE PTR _sqrtTab[ebx]
  352. shr eax, 1
  353. ; r1=r+1;
  354. ; if (r1*r1>=n) r++;
  355. lea ebx, DWORD PTR [eax+1]
  356. mov edx, ebx
  357. imul edx, ebx
  358. cmp ecx, edx
  359. sbb eax,-1
  360. pop ebx
  361. ret 0
  362. L25250:
  363. ; case 7:
  364. ; r=(sqrtTab[n>>8]);
  365. mov ebx, ecx
  366. shr ebx, 8
  367. mov al, BYTE PTR _sqrtTab[ebx]
  368. ; r1=r+1;
  369. ; if (r1*r1>=n)
  370. lea ebx, DWORD PTR [eax+1]
  371. mov edx, ebx
  372. imul edx, ebx
  373. cmp ecx, edx
  374. sbb eax,-1
  375. pop ebx
  376. ret 0
  377. L25252:
  378. ; case 8:
  379. ; r=(sqrtTab[n>>10]<<1);
  380. mov eax,ecx
  381. xor ebx,ebx
  382. shr eax, 10
  383. mov bl, BYTE PTR _sqrtTab[eax]
  384. add ebx, ebx ;r=(sqrtTab[n>>10]<<1);
  385. ;r= (n/r + r)/2;
  386. xor edx,edx
  387. mov eax,ecx
  388. div ebx
  389. add eax, ebx
  390. shr eax, 1
  391. ; if (r*r>n) r--;
  392. mov edx,eax
  393. imul edx,eax
  394. cmp ecx,edx
  395. sbb eax,0
  396. pop ebx
  397. ret 0
  398. L25254:
  399. ; case 9:
  400. ; r=(sqrtTab[n>>12]<<2);
  401. mov eax,ecx
  402. xor ebx,ebx
  403. shr eax, 12
  404. mov bl, BYTE PTR _sqrtTab[eax]
  405. shl ebx, 2
  406. ;r= (n/r + r)/2;
  407. xor edx,edx
  408. mov eax,ecx
  409. div ebx
  410. add eax, ebx
  411. shr eax, 1
  412. ; if (r*r>n) r--;
  413. mov edx,eax
  414. imul edx,eax
  415. cmp ecx,edx
  416. sbb eax,0
  417. pop ebx
  418. ret 0
  419. L25256:
  420. ; case 10:
  421. ; r=(sqrtTab[n>>14]<<3);
  422. mov eax,ecx
  423. xor ebx,ebx
  424. shr eax, 14
  425. mov bl, BYTE PTR _sqrtTab[eax]
  426. shl ebx, 3
  427. ;r= (n/r + r)/2;
  428. xor edx,edx
  429. mov eax,ecx
  430. div ebx
  431. add eax, ebx
  432. shr eax, 1
  433. ; if (r*r>n) r--;
  434. mov edx,eax
  435. imul edx,eax
  436. cmp ecx,edx
  437. sbb eax,0
  438. pop ebx
  439. ret 0
  440. L25258:
  441. ; case 11:
  442. ; r=(sqrtTab[n>>16]<<4);
  443. mov eax,ecx
  444. xor ebx,ebx
  445. shr eax, 16
  446. mov bl, BYTE PTR _sqrtTab[eax]
  447. shl ebx, 4
  448. ;r= (n/r + r)/2;
  449. xor edx,edx
  450. mov eax,ecx
  451. div ebx
  452. add eax, ebx
  453. shr eax, 1
  454. ; if (r*r>n) r--;
  455. mov edx,eax
  456. imul edx,eax
  457. cmp ecx,edx
  458. sbb eax,0
  459. pop ebx
  460. ret 0
  461. L25260:
  462. ; case 12:
  463. ; r=(sqrtTab[n>>18]<<5);
  464. mov eax,ecx
  465. xor ebx,ebx
  466. shr eax, 18
  467. mov bl, BYTE PTR _sqrtTab[eax]
  468. shl ebx, 5
  469. ;r= (n/r + r)/2;
  470. xor edx,edx
  471. mov eax,ecx
  472. div ebx
  473. add eax, ebx
  474. shr eax, 1
  475. ; if (r*r>n) r--;
  476. mov edx,eax
  477. imul edx,eax
  478. cmp ecx,edx
  479. sbb eax,0
  480. pop ebx
  481. ret 0
  482. L25262:
  483. ; case 13:
  484. ; r=(sqrtTab[n>>20]<<6);
  485. mov eax,ecx
  486. xor ebx,ebx
  487. shr eax, 20
  488. mov bl, BYTE PTR _sqrtTab[eax]
  489. shl ebx, 6
  490. ;r= (n/r + r)/2;
  491. xor edx,edx
  492. mov eax,ecx
  493. div ebx
  494. add eax, ebx
  495. shr eax, 1
  496. ; if (r*r>n) r--;
  497. mov edx,eax
  498. imul edx,eax
  499. cmp ecx,edx
  500. sbb eax,0
  501. pop ebx
  502. ret 0
  503. L25264:
  504. ; case 14:
  505. ; r=(sqrtTab[n>>22]<<7);
  506. mov eax,ecx
  507. xor ebx,ebx
  508. shr eax, 22
  509. mov bl, BYTE PTR _sqrtTab[eax]
  510. shl ebx, 7
  511. ;r= (n/r + r)/2;
  512. xor edx,edx
  513. mov eax,ecx
  514. div ebx
  515. add ebx, eax
  516. shr ebx, 1
  517. ;r= (n/r + r)/2;
  518. xor edx,edx
  519. mov eax,ecx
  520. div ebx
  521. add eax, ebx
  522. shr eax, 1
  523. ; if (r*r>n) r--;
  524. mov edx,eax
  525. imul edx,eax
  526. cmp ecx,edx
  527. sbb eax,0
  528. pop ebx
  529. ret 0
  530. L25266:
  531. ; case 15:
  532. ; r=(sqrtTab[n>>24]<<8);
  533. mov eax,ecx
  534. xor ebx,ebx
  535. shr eax, 24
  536. mov bh, BYTE PTR _sqrtTab[eax]
  537. ;r= (n/r + r)/2;
  538. xor edx,edx
  539. mov eax,ecx
  540. div ebx
  541. add ebx, eax
  542. shr ebx, 1
  543. ;r= (n/r + r)/2;
  544. xor edx,edx
  545. mov eax,ecx
  546. div ebx
  547. add eax, ebx
  548. shr eax, 1
  549. ; if (r*r>n) r--;
  550. mov edx,eax
  551. imul edx,eax
  552. cmp ecx,edx
  553. sbb eax,0
  554. pop ebx
  555. ret 0
  556. align 4
  557. L25370:
  558. DD 0
  559. DD 0
  560. DD 0
  561. DD L25242
  562. DD L25244
  563. DD L25246
  564. DD L25248
  565. DD L25250
  566. DD L25252
  567. DD L25254
  568. DD L25256
  569. DD L25258
  570. DD L25260
  571. DD L25262
  572. DD L25264
  573. DD L25266
  574. @UintSqrt@4 ENDP
  575. _TEXT ENDS
  576. END
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-12 09:08:10 | 显示全部楼层
你只是把C改成了汇编形式 用汇编要用汇编的思维重新写算法的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-12 11:02:28 | 显示全部楼层

回复 28# 无心人 的帖子

No,No,No. 虽然只是修改,但是修改的很多,尽量使用汇编的特性,以case 8为例,主要区别有: 1. 寄存器的使用和编译器有很大的不同,直接编译出来的版本用到esi寄存器,需要两条保存寄存器指令,两条恢复指令,而我则用了一条寄存器保存和恢复指令,尽量合理调度指令,在同样的执行路径上,指令数也较叫编译器少。 2. 为了速度快,宁愿写重复的代码,来减少跳转指令的使用。编译出来的版本使用了在case 8路径上需要执行3条条件转移指令,2条jmp跳转指令,而我的版本只用一条条件转移指令和一条jmp指令 3. "if (r1*r1>=n) r++;" 这样的代码,编译器是使用jbe指令来做的,而我是采用 sbb eax,0 指令来实现的。 4. 如果没有imul,div指令,我改编后的代码速度提高的就不是10%了。因为imul,div占主要运行时间,所以改用汇编后提速不大。 顺便说一下,我的C版在调用log2时,并没有使用call指令,log2被声明为inline函数,所以汇编提速(10%)全靠减少指令条数和减少跳转指令。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-2-12 11:42:49 | 显示全部楼层
呵呵 是否有整数算法不如浮点的结论了?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-21 20:33 , Processed in 0.029056 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表