㈠ linux求数组长度为10000的浮点数(精确小数点右4位)计算值
既然题主没有说要求用什么语言,那我就用c++11实现了。
#include<iostream>
#include<random>
#include<thread>
#include<chrono>
#include<algorithm>
#include<iomanip>
usingnamespacestd;
constintsize=10000;
floattable[size];
intmain(){
random_deviceengine;
uniform_real_distribution<float>dist(0,1);
floatsum;
for(auto&i:table){
i=dist(engine);
}
autot_start=chrono::system_clock::now();
sum=accumulate(table,table+size,0.0);
autot_end=chrono::system_clock::now();
autoration=std::chrono::ration_cast<std::chrono::microseconds>(t_end-t_start).count();
cout<<"sumofthemainthread:"<<fixed<<setprecision(4)<<sum<<endl;
cout<<"timeelapsed:"<<ration<<"microseconds"<<endl;
floatsum_child[4];
autofun=[&](intindex){
sum_child[index]=accumulate(table+index*size/4,table+(index+1)*size/4,0.0);
};
t_start=chrono::system_clock::now();
threadthrd_table[4]={
thread(fun,0),thread(fun,1),thread(fun,2),thread(fun,3)
};
for(auto&thrd:thrd_table){
thrd.join();
}
sum=0;
sum=accumulate(sum_child,sum_child+4,0.0);
t_end=chrono::system_clock::now();
ration=std::chrono::ration_cast<std::chrono::microseconds>(t_end-t_start).count();
cout<<"sumofchildthreads:"<<fixed<<setprecision(4)<<sum<<endl;
cout<<"timeelapsed:"<<ration<<"microseconds"<<endl;
return0;
}
编译:
g++-std=c++11test.cc-lpthread-otest
运行:
./test
结果:
sumofthemainthread:4976.8721
timeelapsed:0ms
sumofchildthreads:4976.8721
timeelapsed:0ms
由于随机性每次加和的数值不同,但是精确到毫秒时,时间测出来妥妥的都是零。就是数据量太小,实际运行时间在微秒量级,当然看不出来。
精度改为微秒以后:
sumofthemainthread:4957.9878
timeelapsed:113microseconds
sumofchildthreads:4957.9878
timeelapsed:560microseconds
多线程反而比单线程慢,因为启动线程本身也需要时间。
数据量再增大1000倍:
sumofthemainthread:4999892.0000
timeelapsed:25313microseconds
sumofchildthreads:4999892.0000
timeelapsed:8986microseconds
这回看着正常多了吧
㈡ linux命令 数值计算 为什么要双括号
(命令) ------> 单个括号的意思是执行括号里面的命令 ((算式)) -------> 双括号的意思是计算里面的算式. 比如 files=$(ls)sum=$((5+2)) shell本身没有计算小数的功能. 你可以用bc命令, 比如 sum=$(echo "2.2+3.3"|bc)