找回密码
 欢迎注册
楼主: gxqcn

[讨论] 不用64位乘除法,求 uint64_t 对 10^9 的余数

[复制链接]
发表于 2017-1-15 17:36:33 | 显示全部楼层
仍然使用11楼的思想,做进一步优化。这个版本使用1次查表(表的大小为128个64bit数),2次比较,4次32位数乘法,10次32位数和64位数移位运算。


  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <limits.h>

  4. typedef int BOOL;
  5. #define TRUE        1
  6. #define FALSE        0

  7. typedef unsigned int uint32_t;

  8. #if defined(_MSC_VER)

  9. typedef unsigned __int64 uint64_t;
  10. #define RAD                        1000000000ui64
  11. #define HALF_RAD        500000000ui64
  12. #define I64_1                1i64

  13. uint64_t prodArr[]=
  14. {
  15.         0ui64,
  16.         144115188000000000ui64,
  17.         288230376000000000ui64,
  18.         432345564000000000ui64,
  19.         576460752000000000ui64,
  20.         720575940000000000ui64,
  21.         864691128000000000ui64,
  22.         1008806316000000000ui64,
  23.         1152921504000000000ui64,
  24.         1297036692000000000ui64,
  25.         1441151880000000000ui64,
  26.         1585267068000000000ui64,
  27.         1729382256000000000ui64,
  28.         1873497444000000000ui64,
  29.         2017612633000000000ui64,
  30.         2161727821000000000ui64,
  31.         2305843009000000000ui64,
  32.         2449958197000000000ui64,
  33.         2594073385000000000ui64,
  34.         2738188573000000000ui64,
  35.         2882303761000000000ui64,
  36.         3026418949000000000ui64,
  37.         3170534137000000000ui64,
  38.         3314649325000000000ui64,
  39.         3458764513000000000ui64,
  40.         3602879701000000000ui64,
  41.         3746994889000000000ui64,
  42.         3891110078000000000ui64,
  43.         4035225266000000000ui64,
  44.         4179340454000000000ui64,
  45.         4323455642000000000ui64,
  46.         4467570830000000000ui64,
  47.         4611686018000000000ui64,
  48.         4755801206000000000ui64,
  49.         4899916394000000000ui64,
  50.         5044031582000000000ui64,
  51.         5188146770000000000ui64,
  52.         5332261958000000000ui64,
  53.         5476377146000000000ui64,
  54.         5620492334000000000ui64,
  55.         5764607523000000000ui64,
  56.         5908722711000000000ui64,
  57.         6052837899000000000ui64,
  58.         6196953087000000000ui64,
  59.         6341068275000000000ui64,
  60.         6485183463000000000ui64,
  61.         6629298651000000000ui64,
  62.         6773413839000000000ui64,
  63.         6917529027000000000ui64,
  64.         7061644215000000000ui64,
  65.         7205759403000000000ui64,
  66.         7349874591000000000ui64,
  67.         7493989779000000000ui64,
  68.         7638104968000000000ui64,
  69.         7782220156000000000ui64,
  70.         7926335344000000000ui64,
  71.         8070450532000000000ui64,
  72.         8214565720000000000ui64,
  73.         8358680908000000000ui64,
  74.         8502796096000000000ui64,
  75.         8646911284000000000ui64,
  76.         8791026472000000000ui64,
  77.         8935141660000000000ui64,
  78.         9079256848000000000ui64,
  79.         9223372036000000000ui64,
  80.         9367487224000000000ui64,
  81.         9511602413000000000ui64,
  82.         9655717601000000000ui64,
  83.         9799832789000000000ui64,
  84.         9943947977000000000ui64,
  85.         10088063165000000000ui64,
  86.         10232178353000000000ui64,
  87.         10376293541000000000ui64,
  88.         10520408729000000000ui64,
  89.         10664523917000000000ui64,
  90.         10808639105000000000ui64,
  91.         10952754293000000000ui64,
  92.         11096869481000000000ui64,
  93.         11240984669000000000ui64,
  94.         11385099857000000000ui64,
  95.         11529215046000000000ui64,
  96.         11673330234000000000ui64,
  97.         11817445422000000000ui64,
  98.         11961560610000000000ui64,
  99.         12105675798000000000ui64,
  100.         12249790986000000000ui64,
  101.         12393906174000000000ui64,
  102.         12538021362000000000ui64,
  103.         12682136550000000000ui64,
  104.         12826251738000000000ui64,
  105.         12970366926000000000ui64,
  106.         13114482114000000000ui64,
  107.         13258597302000000000ui64,
  108.         13402712491000000000ui64,
  109.         13546827679000000000ui64,
  110.         13690942867000000000ui64,
  111.         13835058055000000000ui64,
  112.         13979173243000000000ui64,
  113.         14123288431000000000ui64,
  114.         14267403619000000000ui64,
  115.         14411518807000000000ui64,
  116.         14555633995000000000ui64,
  117.         14699749183000000000ui64,
  118.         14843864371000000000ui64,
  119.         14987979559000000000ui64,
  120.         15132094747000000000ui64,
  121.         15276209936000000000ui64,
  122.         15420325124000000000ui64,
  123.         15564440312000000000ui64,
  124.         15708555500000000000ui64,
  125.         15852670688000000000ui64,
  126.         15996785876000000000ui64,
  127.         16140901064000000000ui64,
  128.         16285016252000000000ui64,
  129.         16429131440000000000ui64,
  130.         16573246628000000000ui64,
  131.         16717361816000000000ui64,
  132.         16861477004000000000ui64,
  133.         17005592192000000000ui64,
  134.         17149707381000000000ui64,
  135.         17293822569000000000ui64,
  136.         17437937757000000000ui64,
  137.         17582052945000000000ui64,
  138.         17726168133000000000ui64,
  139.         17870283321000000000ui64,
  140.         18014398509000000000ui64,
  141.         18158513697000000000ui64,
  142.         18302628885000000000ui64
  143. };

  144. #elif defined(__GNUC__)
  145. typedef unsigned long long uint64_t;

  146. #define HALF_RAD        500000000LL
  147. #define RAD                        1000000000LL
  148. #define I64_1  1LL

  149. uint64_t prodArr[]=
  150. {
  151.         0LL,
  152.         144115188000000000LL,
  153.         288230376000000000LL,
  154.         432345564000000000LL,
  155.         576460752000000000LL,
  156.         720575940000000000LL,
  157.         864691128000000000LL,
  158.         1008806316000000000LL,
  159.         1152921504000000000LL,
  160.         1297036692000000000LL,
  161.         1441151880000000000LL,
  162.         1585267068000000000LL,
  163.         1729382256000000000LL,
  164.         1873497444000000000LL,
  165.         2017612633000000000LL,
  166.         2161727821000000000LL,
  167.         2305843009000000000LL,
  168.         2449958197000000000LL,
  169.         2594073385000000000LL,
  170.         2738188573000000000LL,
  171.         2882303761000000000LL,
  172.         3026418949000000000LL,
  173.         3170534137000000000LL,
  174.         3314649325000000000LL,
  175.         3458764513000000000LL,
  176.         3602879701000000000LL,
  177.         3746994889000000000LL,
  178.         3891110078000000000LL,
  179.         4035225266000000000LL,
  180.         4179340454000000000LL,
  181.         4323455642000000000LL,
  182.         4467570830000000000LL,
  183.         4611686018000000000LL,
  184.         4755801206000000000LL,
  185.         4899916394000000000LL,
  186.         5044031582000000000LL,
  187.         5188146770000000000LL,
  188.         5332261958000000000LL,
  189.         5476377146000000000LL,
  190.         5620492334000000000LL,
  191.         5764607523000000000LL,
  192.         5908722711000000000LL,
  193.         6052837899000000000LL,
  194.         6196953087000000000LL,
  195.         6341068275000000000LL,
  196.         6485183463000000000LL,
  197.         6629298651000000000LL,
  198.         6773413839000000000LL,
  199.         6917529027000000000LL,
  200.         7061644215000000000LL,
  201.         7205759403000000000LL,
  202.         7349874591000000000LL,
  203.         7493989779000000000LL,
  204.         7638104968000000000LL,
  205.         7782220156000000000LL,
  206.         7926335344000000000LL,
  207.         8070450532000000000LL,
  208.         8214565720000000000LL,
  209.         8358680908000000000LL,
  210.         8502796096000000000LL,
  211.         8646911284000000000LL,
  212.         8791026472000000000LL,
  213.         8935141660000000000LL,
  214.         9079256848000000000LL,
  215.         9223372036000000000LL,
  216.         9367487224000000000LL,
  217.         9511602413000000000LL,
  218.         9655717601000000000LL,
  219.         9799832789000000000LL,
  220.         9943947977000000000LL,
  221.         10088063165000000000LL,
  222.         10232178353000000000LL,
  223.         10376293541000000000LL,
  224.         10520408729000000000LL,
  225.         10664523917000000000LL,
  226.         10808639105000000000LL,
  227.         10952754293000000000LL,
  228.         11096869481000000000LL,
  229.         11240984669000000000LL,
  230.         11385099857000000000LL,
  231.         11529215046000000000LL,
  232.         11673330234000000000LL,
  233.         11817445422000000000LL,
  234.         11961560610000000000LL,
  235.         12105675798000000000LL,
  236.         12249790986000000000LL,
  237.         12393906174000000000LL,
  238.         12538021362000000000LL,
  239.         12682136550000000000LL,
  240.         12826251738000000000LL,
  241.         12970366926000000000LL,
  242.         13114482114000000000LL,
  243.         13258597302000000000LL,
  244.         13402712491000000000LL,
  245.         13546827679000000000LL,
  246.         13690942867000000000LL,
  247.         13835058055000000000LL,
  248.         13979173243000000000LL,
  249.         14123288431000000000LL,
  250.         14267403619000000000LL,
  251.         14411518807000000000LL,
  252.         14555633995000000000LL,
  253.         14699749183000000000LL,
  254.         14843864371000000000LL,
  255.         14987979559000000000LL,
  256.         15132094747000000000LL,
  257.         15276209936000000000LL,
  258.         15420325124000000000LL,
  259.         15564440312000000000LL,
  260.         15708555500000000000LL,
  261.         15852670688000000000LL,
  262.         15996785876000000000LL,
  263.         16140901064000000000LL,
  264.         16285016252000000000LL,
  265.         16429131440000000000LL,
  266.         16573246628000000000LL,
  267.         16717361816000000000LL,
  268.         16861477004000000000LL,
  269.         17005592192000000000LL,
  270.         17149707381000000000LL,
  271.         17293822569000000000LL,
  272.         17437937757000000000LL,
  273.         17582052945000000000LL,
  274.         17726168133000000000LL,
  275.         17870283321000000000LL,
  276.         18014398509000000000LL,
  277.         18158513697000000000LL,
  278.         18302628885000000000LL
  279. };

  280. #else
  281.         #error do not support this compiler
  282. #endif

  283. void output_table()
  284. {
  285.         uint64_t i,n,q,prod;
  286.         uint64_t imax,max;
  287.         uint64_t low57bits=(I64_1 << 57)-I64_1;;
  288.        
  289.         printf("uint64_t prodArr[]=\n{\n");
  290.         for (max=0,i=0;i<128;i++)
  291.         {
  292.                 n=( i << 57);
  293.                 q= n / RAD;
  294.                 prod=q * RAD;
  295.                 printf("\t%I64u,\n", prod);
  296.                 imax= n + low57bits- prod;
  297.                 if (imax>max)
  298.                         max=imax;
  299.         }
  300.         printf("};\n");
  301.         // printf("\nmax remainder =%I64u",max);
  302.         //max remainder =144115189068469759
  303. }

  304. /*
  305.         1. 关于 计算 a/10^9
  306.         a/10^9 = a * 10^-9=  (a * 2199.023255552) / 2^41,故我们采用2种方法来近似计算 q= a/(10^9)
  307.         方法1.
  308.              u32_q =(uint32)(x>>37);
  309.                  u32_q *= 2199;
  310.                  u32_q >>= 17;
  311.                  u64_q = (uint64_t)u32_q
  312.                  u64_q <<= 13
  313.        
  314.         方法2.
  315.                 u32_q =(uint32)(a>>23)
  316.                 u32_q *= 2199
  317.                 u32_q >>=18
  318.        
  319.         2. 关于 计算 u32_q * 10^9
  320.           当u32_q <= 29820, 可使用下面的方法 计算u64_x= u32_q * 10^9
  321.              u32_prod= u32_q * 144027
  322.              u64_t1=(uint64_t)u32_q
  323.              u64_t2=(uint64_t)u32_prod
  324.              u64_x= (u64_t1<<30) - (u64_t2<<9)
  325. */

  326. uint32_t Uint64ModBillion(uint64_t a)
  327. {
  328.         int i;
  329.         uint64_t u64_t1,u64_t2,u64_prod;
  330.         uint32_t u32_q,u32_prod;

  331.         // step1
  332.         i =(int) (a >> 57);       
  333.         // 根据最高7bit idx,找到一个值 x= prodArr[i], 使得 prodArr[i]是10^9的倍数,且prodArr[i]>=a
  334.         a -=  prodArr[i];                //至此,a的最大值为 144115189068469759= 1.0000000068876424494379584473336 * 2^57

  335.         // step2
  336.         u32_q=(uint32_t)(a >>37);        // max(u32_q)= max(a)/2^37=144115189068469759/2^37=1048576
  337.         u32_q *= 2199;                                // max(u32_q)= 1048576*2199=2305818624 < 2^32
  338.         u32_q >>=17;                                // max(u32_q)= (1048576*2199) >>17 =17592 < 29820

  339.         //误差分析
  340.         //这里 u32_q 约等于 int((a/10^9)/2^13),
  341.         //若 q=(a/10^9)/2^13, 则 max(a-u32_q) <= 1+ max(a)/(2^54)*0.023255552= 1+0.1860= 1.1860
  342.        
  343.         u32_prod  = u32_q * 144027;
  344.         u64_t1 = (uint64_t)u32_q;
  345.         u64_t2 = (uint64_t)u32_prod;
  346.         u64_prod  = (u64_t1<<30) - (u64_t2<<9);                // u64_prod= (uint64_t)u32_q * 10^9
  347.         a-= (u64_prod<<13);
  348.                                                          
  349.         // 这里a的最大值= (2^37-1)+1.1860*(2^13)*(10^9)= 9853514819840<2^44
  350.        
  351.         // step3
  352.         u32_q=(uint32_t)(a >>23);        // max(u32_q)= max(a)/2^23=9853514819840/2^23 = 1174630
  353.         u32_q *= 2199;                                // max(u32_q)= 1174630*2199=2583011370 < 2^32
  354.         u32_q >>=18;                                // max(u32_q)= (2583011370>>18)=9853 < 29820
  355.        
  356.         u32_prod  = u32_q * 144027;
  357.         u64_t1 = (uint64_t)u32_q;
  358.         u64_t2 = (uint64_t)u32_prod;
  359.         u64_prod  = (u64_t1<<30) - (u64_t2<<9);        // u64_prod= (uint64_t)u32_q * 10^9
  360.         a-= u64_prod;

  361.         //误差分析
  362.         //这里 u32_q 约等于 int((a/10^9))
  363.         //若q=(a/10^9), 则 max(a-u32_q)<= 1+ max(a)/(2^41)*0.023255552= 1+0.1042= 1.1042
  364.         // 这里a的最大值= (2^23-1)+1.1042*(10^9)= 1112588607
  365.         if ( a>=RAD)  //因为a的最大值为1112588607,故只需调整余数一次
  366.                 a-=RAD;

  367.         return (uint32_t)a;
  368. }
  369. int main(int argc, char* argv[])
  370. {
  371.         uint64_t a;
  372.         uint32_t mod;
  373.        
  374.         //output_table();
  375.         a=9223372036854775807I64;
  376.         mod=Uint64ModBillion(a);
  377.         if ( mod >=HALF_RAD)
  378.                 printf("TRUE");
  379.         else
  380.                 printf("FALSE");
  381.         return 0;
  382. }

复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-1-15 22:27:22 | 显示全部楼层
本帖最后由 happysxyf 于 2017-1-15 23:26 编辑
liangbch 发表于 2017-1-15 10:43
还有, 我把 ”if(a-((a>>1)


QQ图片20170115232607.png
主要是站长没说可以用uint64_t类型的与运算,我也不知道他们的硬件是否允许uint64_t的与运算。

你的代码优化的非常好。我还在寻找能否继续减少循坏次数,因为他的是纳秒。如果是10负9次方的响应,那C语言根本达不到,因为C语言计算个1+1耗时都要1纳秒。总之,我的取余程序根本达不到小于10的负9次方秒的瞬间响应。

点评

并不是要求计算非得在 1ns 内完成;但要求读到的纳秒数后,计算的结果要准确;当然算法效率越快越好!  发表于 2017-1-16 08:52
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-1-16 07:33:13 | 显示全部楼层
那C语言根本达不到,因为C语言计算个1+1耗时都要1纳秒

不是的,如果你做大量的测试,会发现,像这种简单加法,耗时可以低于1个时钟周期。我的测试表明,在大量循环的情况下,在Intel两年内出的I7 CPU运行,下面4条指令总的执行时间可以低于1.3个时钟周期。

  1.         mov   eax, DP [esi]
  2.         mul   DP [edi]
  3.         add   ecx, eax
  4.         adc   ebx, edx
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-1-16 08:26:17 来自手机 | 显示全部楼层
http://www.cnblogs.com/shines77/p/4189074.html
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-1-16 08:29:27 来自手机 | 显示全部楼层
郭要求的其实是除以$5^9*2^8$商的奇偶性
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-1-16 08:38:59 来自手机 | 显示全部楼层
另外感觉去掉被除数末八比特除以5^9求奇偶性也可
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-1-16 08:41:32 | 显示全部楼层
mathe 的提示切中要害!

既然需要的是求被 \(10^9\) 除后的余数与 \(2^8*5^9\) 进行大小比较,
那么被除数的低 \(8\) 位对结果不产生任何影响。

继续推导下去,可将被除数、除数及余数同时右移 \(8\) 位,等式仍成立,
要比较的数值降低为 \(5^9\)。

对于除法运算来说,在除数腾空 \(8\) 位之后,\(32\) 位下的运算优化腾挪余地就大多了。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-1-16 10:55:01 | 显示全部楼层
   除以10^9判断余数,需要求出35bit商,除以5*10^8判断商的奇偶性,需要求出36bit商。在第二种情况,因为只需要考虑商(不考虑余数),被除数和除数可同时缩小,商不变。使用第2种方法,可减少移位次数。但乘法次数很难减少。我21楼的代码,使用了1次查表(表格可改为uint32进一步缩小空间),4次32位数乘法。我想不管用什么方法,很难将乘法次数将到4次以下。除非增加相当多的的移位指令和比较指令。由于分支预测的关系,比较跳转指令对显著降低了程序的速度,所以我建议尽可能少用比较或者跳转指令。

  为什么是“4次32位数乘法”?
  以乘代除法的本质是将一次除法转化为2次乘法。因为商是35bit,使用查表得到6bit商,其后的第1次以乘代除法,得到15bit商,使用2次乘法,第2次以乘代除法,得到大约14bit商,同样使用2次乘法。基于严密的误差分析,第1次以乘代除法没有调整余数的过程,第2次以乘代除法也只需1次调整余数的过程。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-1-16 10:57:06 | 显示全部楼层
关于以乘代除法,事实上我做了更多的独立地研究,国外也早就有类似的论文,如《Division by Invariant Integers using Multiplication》

对于郭子的论文,我补充几点。
1. http://www.cnblogs.com/shines77/p/4189074.html 中提到。"只有q的误差E<1/c, 则能保证q1=q"
当被除数为32比特以内的数,c可能有多个。但是在实践中,更常用的是长除法,即被除数a并不满足a<RAD, 但满足 a<=RAD*c-1时。在这种情况下,c只有一个,那就是3.  故GMP中有一个单独的除法函数mpn_divexact_by3。

2. 因为以乘代除法计算a/c时,得到的商q0和真实的商q有偏差,故在完成a=a-q0*c后,a可能小于0或者大于c,这是就需要调整余数和商,每次调整需要1次比较和一次加减法,在实践中,我们需要分析余数a的最大值或者最大误差,这样就可事先确定最多要做几次调整。郭子的论文中,没有给出进一步的误差分析。



毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-1-16 13:33:39 | 显示全部楼层
现在,公布一下我们的作法:
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <tchar.h>
  4. #include <assert.h>

  5. typedef union
  6. {
  7.     uint64_t        u64;

  8.     struct
  9.     {
  10.         uint32_t    u32L;
  11.         uint32_t    u32H;
  12.     };

  13.     uint8_t         u8[ 8 ];
  14. }UINT64;


  15. #define HMOD        1953125u    // = 5**9
  16. #define MOD         3906250u    // = 2 * HMOD
  17. #define C24         1152216u    // = 2**24 % MOD
  18. #define C32         1998546u    // = 2**32 % MOD
  19. #define C40         3815276u    // = 2**40 % MOD
  20. #define C48          148156u    // = 2**48 % MOD
  21. // 255 * ( C24 + C32 + C40 + C48 ) = 1 814 119 470


  22. uint32_t Algo_1( uint64_t v )
  23. {
  24.     UINT64 u;

  25.     u.u64 = v;
  26.     u.u64 >>= 8u;

  27.     // 整体移位后,u.u8[ 7 ] 一定为 0
  28.     return (( u.u32L % MOD )
  29.             + u.u8[ 4 ] * C32
  30.             + u.u8[ 5 ] * C40
  31.             + u.u8[ 6 ] * C48 ) % MOD;
  32. }


  33. uint32_t Algo_2( uint64_t v )
  34. {
  35.     UINT64 u;

  36.     u.u64 = v;
  37.     u.u64 >>= 8u;

  38.     // 在 Algo_1 基础上,减少一次 % 运算
  39.     return (( u.u32L < 2000000000u ? u.u32L : u.u32L - 2000000000u )
  40.             + u.u8[ 4 ] * C32
  41.             + u.u8[ 5 ] * C40
  42.             + u.u8[ 6 ] * C48 ) % MOD;
  43. }



  44. uint32_t Algo_3( uint64_t v )
  45. {
  46.     UINT64 u;

  47.     u.u64 = v;

  48.     // 不整体移位,仅低 32 位移位,消除分支,全程仅一次 % 运算
  49.     return (( u.u32L >> 8u )
  50.             + u.u8[ 4 ] * C24
  51.             + u.u8[ 5 ] * C32
  52.             + u.u8[ 6 ] * C40
  53.             + u.u8[ 7 ] * C48 ) % MOD;
  54. }


  55. int _tmain(int argc, _TCHAR* argv[])
  56. {
  57.     uint64_t v = 9223372036854775807ULL;
  58.     uint32_t r, r1, r2, r3;

  59.     r = ( v % 1000000000u ) >> 8u;
  60.    
  61.     r1 = Algo_1( v );
  62.     r2 = Algo_2( v );
  63.     r3 = Algo_3( v );

  64.     assert( r1 == r );
  65.     assert( r2 == r );
  66.     assert( r3 == r );

  67.     printf( "%s", ( r3 < HMOD ? "true" : "false" ));

  68.     return 0;
  69. }
复制代码


其中在 Algo_3 里,32位的 >>运算1次,*运算4次,+运算4次,%运算1次。

注意到 u.u8[ 4 ] * C24 + u.u8[ 5 ] * C32 + u.u8[ 6 ] * C40 + u.u8[ 7 ] * C48 \( \leqslant 255 * ( C24 + C32 + C40 + C48 ) = 1 814 119 470 \lt 2^{32} - 2^{24}\),
故全程运算均在 \(32\) 位以内,不存在溢出风险。

点评

@happysxyf  发表于 2017-1-17 17:53
一个时钟周期基本上是1纳秒了  发表于 2017-1-17 17:53
你这时间是怎么统计的,可以达到几个纳秒的级别?  发表于 2017-1-17 17:52
是5~40纳秒,用时由 v 的长度决定。  发表于 2017-1-16 14:43
效果非常理想,速度也达到5纳秒以内的响应。  发表于 2017-1-16 14:32
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-26 19:24 , Processed in 0.062787 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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