62,620
社区成员
发帖
与我相关
我的任务
分享 cout<<"VC++ 正对表达式进行循环求和计算,请等待... ..."<<endl;
z=0.0; old=clock();
for(x=0.0;x<=1.0;x=x+0.0011)
for(y=1.0;y<=2.0;y=y+0.0011)
{
z=z+cos(1.0-sin(1.2*pow(x+0.1,y/2.0-x)+cos(1.0-sin(1.2*pow(x+0.2,y/3.0-x))))-cos(1.0-sin(1.2*pow(x+0.3,y/4.0-x)))-cos(1.0-sin(1.2*pow(x+0.4,y/5.0-x)+cos(1.0-sin(1.2*pow(x+0.5,y/6.0-x))))-cos(1.0-sin(1.2*pow(x+0.6,y/7.0-x)))));
}
now=clock();
cout<<"VC++ 计算结果:"<<setprecision(20)<<z<<' ';
cout<<" 运行时间:"<<now-old<<" 即: "<<(double)(now-old)/CLOCKS_PER_SEC<<"秒"<<endl<<endl;
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
//==============================================================================
//
// Define Operator
//
#define DATA_1 0x81 // Push Data 1
#define DATA_2 0x82 // Push Data 2
#define DATA_3 0x83 // Push Data 3
#define DATA_4 0x84 // Push Data 4
#define DATA_5 0x85 // Push Data 5
#define DATA_6 0x86 // Push Data 6
#define DATA_7 0x87 // Push Data 7
#define DATA_8 0x88 // Push Data 8
#define OPT_ADD 0x01 // + (Pop 2 Data, Push Result)
#define OPT_SUB 0x02 // - (Pop 2 Data, Push Result)
#define OPT_MUL 0x03 // * (Pop 2 Data, Push Result)
#define OPT_DIV 0x04 // / (Pop 2 Data, Push Result)
#define OPT_DUP 0x11 // Dup Data (Pop 1 Data, Push 2 Copy)
#define OPT_SWAP 0x12 // Swap Data (Pop 2 Data, Swap Data, Push 2 Data)
#define OPT_END 0xFF // Pop 1 Data, Return
//==============================================================================
//
// Function
//
__forceinline DOUBLE WINAPI DynCalc(BYTE * pOpt, DOUBLE * pData)
{
DOUBLE dStack[1024] = { 0 };
DOUBLE * pStack = dStack;
DOUBLE dTemp;
for (;;)
{
switch (*pOpt)
{
case DATA_1: *pStack = pData[0]; pStack++; break;
case DATA_2: *pStack = pData[1]; pStack++; break;
case DATA_3: *pStack = pData[2]; pStack++; break;
case DATA_4: *pStack = pData[3]; pStack++; break;
case DATA_5: *pStack = pData[4]; pStack++; break;
case DATA_6: *pStack = pData[5]; pStack++; break;
case DATA_7: *pStack = pData[6]; pStack++; break;
case DATA_8: *pStack = pData[7]; pStack++; break;
case OPT_ADD: pStack--; *(pStack - 1) += *pStack; break;
case OPT_SUB: pStack--; *(pStack - 1) -= *pStack; break;
case OPT_MUL: pStack--; *(pStack - 1) *= *pStack; break;
case OPT_DIV: pStack--; *(pStack - 1) /= *pStack; break;
case OPT_DUP:
{
*pStack = *(pStack - 1);
pStack ++;
break;
}
case OPT_SWAP:
{
dTemp = *(pStack - 1);
*(pStack - 1) = *(pStack - 2);
*(pStack - 2) = dTemp;
break;
}
case OPT_END:
return *(pStack - 1);
}
pOpt++;
}
}
VOID WINAPI DynCalc2(DWORD dwLoop, BYTE * pOpt, DOUBLE * pData, DOUBLE * pResult)
{
DOUBLE dStack[1024] = { 0 };
DOUBLE * pStack = dStack;
BYTE * pRawOpt = pOpt;
DOUBLE dTemp;
for (;;)
{
switch (*pOpt)
{
case DATA_1: *pStack = pData[0]; pStack++; break;
case DATA_2: *pStack = pData[1]; pStack++; break;
case DATA_3: *pStack = pData[2]; pStack++; break;
case DATA_4: *pStack = pData[3]; pStack++; break;
case DATA_5: *pStack = pData[4]; pStack++; break;
case DATA_6: *pStack = pData[5]; pStack++; break;
case DATA_7: *pStack = pData[6]; pStack++; break;
case DATA_8: *pStack = pData[7]; pStack++; break;
case OPT_ADD: pStack--; *(pStack - 1) += *pStack; break;
case OPT_SUB: pStack--; *(pStack - 1) -= *pStack; break;
case OPT_MUL: pStack--; *(pStack - 1) *= *pStack; break;
case OPT_DIV: pStack--; *(pStack - 1) /= *pStack; break;
case OPT_DUP:
{
*pStack = *(pStack - 1);
pStack ++;
break;
}
case OPT_SWAP:
{
dTemp = *(pStack - 1);
*(pStack - 1) = *(pStack - 2);
*(pStack - 2) = dTemp;
break;
}
case OPT_END:
{
*pResult = *(pStack - 1);
pResult ++;
pStack --;
pOpt = pRawOpt;
dwLoop --;
if (dwLoop == 0)
return;
continue;
}
}
pOpt++;
}
}
int main()
{
DOUBLE dP1 = (DOUBLE)rand() / 600.0;
DOUBLE dP2 = (DOUBLE)rand() / 601.0;
DOUBLE dP3 = (DOUBLE)rand() / 602.0;
DOUBLE dP4 = (DOUBLE)rand() / 603.0;
DOUBLE dResult;
DWORD dwLoop = 1000000;
BYTE btOpt[] = {DATA_1, DATA_2, DATA_3, OPT_MUL, DATA_4, OPT_DIV, DATA_5, OPT_MUL, OPT_ADD, OPT_END};
DOUBLE dData[] = {dP1, dP2, 2.0, dP3, 2.5};
DOUBLE * pData2 = (DOUBLE *)malloc(dwLoop * sizeof(dData));
DOUBLE * pResult = (DOUBLE *)malloc(dwLoop * sizeof(dResult));
DWORD s, e;
DWORD i;
{
DOUBLE * pTemp = pData2;
for (i = 0; i < dwLoop; i++)
{
memcpy(pTemp, dData, sizeof(dData));
pTemp += (sizeof(dData) / sizeof(DOUBLE));
}
}
//==============================================================================
// s = GetTickCount();
//
// for (i = 0; i < dwLoop; i++)
// {
// dResult = DynCalc(btOpt, dData);
// }
//
// e = GetTickCount();
// printf("%f, %d\n", dResult, e - s);
//==============================================================================
s = GetTickCount();
DynCalc2(dwLoop, btOpt, pData2, pResult);
e = GetTickCount();
printf("%f, %d\n", *pResult, e - s);
//==============================================================================
s = GetTickCount();
for (i = 0; i < dwLoop; i++)
{
dResult = dP1 + dP2 * 2.0 / dP3 * 2.5;
}
e = GetTickCount();
printf("%f, %d\n", dResult, e - s);
//==============================================================================
return 0;
}