10 #ifndef SC_OPENCL_OPINLINFUN_finacial
11 #define SC_OPENCL_OPINLINFUN_finacial
14 "= {0, 9e-1, 9e-2, 9e-3, 9e-4, 9e-5, 9e-6, 9e-7, "
15 "9e-8,9e-9, 9e-10, 9e-11, 9e-12, 9e-13, 9e-14, 9e-15};\n";
18 "constant double SCdEpsilon = 1.0E-7;\n";
20 std::string
RoundDecl =
"double Round(double fValue);\n";
23 "double Round(double fValue)\n"
25 " if ( fValue == 0.0 )\n"
30 " if ( fValue > 0.0 )\n"
31 " nExp = ( floor( log10( fValue ) ) );\n"
34 " int nIndex = 15 - nExp;\n"
35 " if ( nIndex > 15 )\n"
37 " else if ( nIndex <= 1 )\n"
39 " fValue = floor( fValue + 0.5 + nCorrVal[nIndex] );\n"
44 "double GetPMT_new( double fRate, double fNper, double fPv, double fFv,"
47 "double GetPMT_new( double fRate, double fNper, double fPv, double fFv,"
51 " double fTerm = pow( 1.0 + fRate, fNper );\n"
52 " if( nPayType > 0 )\n"
53 " fPmt = ( fFv * fRate *pow ( fTerm - 1.0,-1 ) + fPv * fRate *pow( "
54 "( 1.0 - pow( fTerm,-1) ),-1) )* pow ( 1.0 + fRate,-1 );\n"
56 " fPmt = fFv * fRate *pow ( fTerm - 1.0 ,-1) + fPv * fRate *pow( "
57 "1.0 - pow( fTerm,-1),-1 );\n"
61 "double GetFV( double fRate, double fNper, double fPmt,"
62 "double fPv, int nPayType );\n";
65 "double GetFV( double fRate, double fNper, double fPmt,"
66 "double fPv, int nPayType )\n"
69 " if( fRate == 0.0 )\n"
70 " fFv = fPv + fPmt * fNper;\n"
73 " double fTerm = pow( 1.0 + fRate, fNper );\n"
74 " if( nPayType > 0 )\n"
75 " fFv = fPv * fTerm + fPmt * ( 1.0 + fRate ) *( fTerm - 1.0 ) "
78 " fFv = fPv * fTerm + fPmt * ( fTerm - 1.0 ) / fRate;\n"
84 "double GetFV_new( double fRate, double fNper, double fPmt,"
85 "double fPv, int nPayType );\n";
88 "double GetFV_new( double fRate, double fNper, double fPmt,"
89 "double fPv, int nPayType )\n"
92 " double fTerm = pow( 1.0 + fRate, fNper );\n"
93 " if( nPayType > 0 )\n"
94 " fFv = fPv * fTerm + fPmt * ( 1.0 + fRate ) *( fTerm - 1.0 ) "
97 " fFv = fPv * fTerm + fPmt * ( fTerm - 1.0 ) *pow( fRate,-1);\n"
102 "bool IsLeapYear( int n );\n";
105 "bool IsLeapYear( int n )\n"
107 " return ( (( ( n % 4 ) == 0 ) && ( ( n % 100 ) != 0)) || ( ( n % 400 ) == "
112 "int DaysInMonth( int nMonth, int nYear );\n";
115 "int DaysInMonth( int nMonth, int nYear )\n"
117 " int aDaysInMonth[12] = { 31, 28, 31, 30, 31, 30,\n"
118 " 31, 31, 30, 31, 30, 31 };\n"
120 " if ( nMonth != 2 )\n"
121 " return aDaysInMonth[nMonth-1];\n"
124 " if ( IsLeapYear(nYear) )\n"
125 " return aDaysInMonth[nMonth-1] + 1;\n"
127 " return aDaysInMonth[nMonth-1];\n"
131 "int DaysInMonth( int nMonth, int nYear );\n";
134 "int DaysInMonth( int nMonth, int nYear )\n"
155 " if ( IsLeapYear(nYear)==1)\n"
165 "void DaysToDate( int nDays, int *rDay, int* rMonth, int* rYear );\n";
168 "void DaysToDate( int nDays, int *rDay, int* rMonth, int* rYear )\n"
177 " nTempDays = nDays;\n"
178 " *rYear = (int)((nTempDays / 365) - i);\n"
179 " nTempDays -= ((int) *rYear -1) * 365;\n"
180 " nTempDays -= (( *rYear -1) / 4) - (( *rYear -1) / 100) +"
181 "((*rYear -1) / 400);\n"
183 " if ( nTempDays < 1 )\n"
190 " if ( nTempDays > 365 )\n"
192 " if ( (nTempDays != 366) || !IsLeapYear( *rYear ) )\n"
200 " while ( bCalc );\n"
201 " if(nTempDays!=0){\n"
202 " for (*rMonth = 1; (int)nTempDays > DaysInMonth( *rMonth, *rYear );"
205 " nTempDays -= DaysInMonth( *rMonth, *rYear );\n"
207 " *rDay = (int)nTempDays;\n"
212 "int DateToDays( int nDay, int nMonth, int nYear );\n";
215 "int DateToDays( int nDay, int nMonth, int nYear )\n"
217 " int nDays = ((int)nYear-1) * 365;\n"
218 " nDays += ((nYear-1) / 4) - ((nYear-1) / 100) + ((nYear-1) / 400);\n"
219 " for( int i = 1; i < nMonth; i++ )\n"
220 " nDays += DaysInMonth(i,nYear);\n"
227 "int DateToDays_new( int nDay, int nMonth, int nYear );\n";
230 "int DateToDays_new( int nDay, int nMonth, int nYear )\n"
232 " int nDays = (nYear-1) * 365;\n"
233 " nDays += (int)((nYear-1) *pow(4.0,-1.0)- (nYear-1) *pow( 100.0,-1.0)"
234 "+ (nYear-1) *pow(400.0,-1.0));\n"
235 " for( int i = 1; i < nMonth; i++ )\n"
236 " nDays += DaysInMonth(i,nYear);\n"
243 "int GetNullDate();\n";
246 "int GetNullDate()\n"
248 " return DateToDays(30,12,1899 );\n"
251 "int GetNullDate_new();\n";
254 "int GetNullDate_new()\n"
256 " return DateToDays_new(30,12,1899 );\n"
260 "void ScaDate( int nNullDate, int nDate, int nBase,int *nOrigDay, "
261 "int *nMonth,int *nYear,int *bLastDayMode,int *bLastDay,"
262 "int *b30Days,int *bUSMode,int *nDay);\n";
265 "void ScaDate( int nNullDate, int nDate, int nBase,int *nOrigDay, "
266 "int *nMonth,int *nYear,int *bLastDayMode,int *bLastDay,"
267 "int *b30Days,int *bUSMode,int *nDay)\n"
269 " DaysToDate( nNullDate + nDate, nOrigDay, nMonth, nYear );\n"
270 " *bLastDayMode = (nBase != 5);\n"
271 " *bLastDay = (*nOrigDay >= DaysInMonth( *nMonth, *nYear ));\n"
272 " *b30Days = (nBase == 0) || (nBase == 4);\n"
273 " *bUSMode = (nBase == 0);\n"
276 " *nDay = min( *nOrigDay, 30);\n"
277 " if( *bLastDay || (*nDay >=DaysInMonth( *nMonth, *nYear )) )\n"
282 " int nLastDay = DaysInMonth( *nMonth, *nYear );\n"
283 " *nDay = *bLastDay ? nLastDay : min( *nOrigDay, nLastDay );\n"
288 "int lcl_GetCouppcd(int nNullDate,int nSettle,int nMat,int nFreq,int nBase);\n";
291 "int lcl_GetCouppcd(int nNullDate,int nSettle, int nMat,int nFreq,int nBase)\n"
293 " int aDate = nMat;\n"
294 " int rDay=0,rMonth=0, rYear=0,rbLastDayMode=0, rbLastDay=0,rb30Days=0,"
295 "rbUSMode=0,rnDay=0;\n"
296 " int sDay=0,sMonth=0, sYear=0,sbLastDayMode=0, sbLastDay=0,sb30Days=0,"
297 "sbUSMode=0,snDay=0;\n"
298 " ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,"
299 "&sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
300 " ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,"
301 "&rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
303 " setDay(rDay,rMonth,rYear,rbLastDay,rb30Days,&rnDay);\n"
304 " if(checklessthan(rYear,sYear,rMonth,sMonth,rnDay,snDay,rbLastDay,"
305 "sbLastDay,rDay,sDay))\n"
308 " setDay(rDay,rMonth,rYear,rbLastDay,rb30Days,&rnDay);\n"
310 " while(checklessthan(sYear,rYear,sMonth,rMonth,snDay,rnDay,sbLastDay,"
311 "rbLastDay,sDay,rDay))\n"
313 " double d = -1*(12/nFreq);\n"
314 " addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,d,&rYear);\n"
316 " int nLastDay = DaysInMonth( rMonth, rYear );\n"
317 " int nRealDay = (rbLastDayMode && rbLastDay) ? nLastDay :"
318 "min( nLastDay, rDay );\n"
319 " return DateToDays( nRealDay, rMonth, rYear ) - nNullDate;\n"
323 "int lcl_GetCoupncd(int nNullDate,int nSettle,int nMat,int nFreq,int nBase);\n";
326 "int lcl_GetCoupncd(int nNullDate,int nSettle, int nMat,int nFreq,int nBase)\n"
328 " int aDate = nMat;\n"
329 " int rDay=0,rMonth=0, rYear=0,rbLastDayMode=0, rbLastDay=0,rb30Days=0,"
330 "rbUSMode=0,rnDay=0;\n"
331 " int sDay=0,sMonth=0, sYear=0,sbLastDayMode=0, sbLastDay=0,sb30Days=0,"
332 "sbUSMode=0,snDay=0;\n"
333 " ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,"
334 "&sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
335 " ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,"
336 "&rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
338 " setDay(rDay,rMonth,rYear,rbLastDay,rb30Days,&rnDay);\n"
339 " if(checklessthan(sYear,rYear,sMonth,rMonth,snDay,rnDay,sbLastDay,rbLastDay"
343 " setDay(rDay,rMonth,rYear,rbLastDay,rb30Days,&rnDay);\n"
345 " while(!checklessthan(sYear,rYear,sMonth,rMonth,snDay,rnDay,sbLastDay,"
346 "rbLastDay,sDay,rDay))\n"
348 " addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,12/nFreq,&rYear);\n"
350 " int nLastDay = DaysInMonth( rMonth, rYear );\n"
351 " int nRealDay = (rbLastDayMode && rbLastDay) ? nLastDay :"
352 "min( nLastDay, rDay );\n"
353 " return DateToDays( nRealDay, rMonth, rYear ) - nNullDate;\n"
357 "void addMonths(int b30Days,int bLastDay,int *nDay,int nOrigDay,"
358 "int *nMonth,int nMonthCount,int *year);\n";
361 "void addMonths(int b30Days,int bLastDay,int *nDay,int nOrigDay,"
362 "int *nMonth,int nMonthCount,int *year)\n"
364 " int nNewMonth = nMonthCount + *nMonth;\n"
365 " if( nNewMonth > 12 )\n"
368 " *year+=nNewMonth / 12 ;\n"
369 " *nMonth = ( nNewMonth % 12 ) + 1;\n"
371 " else if( nNewMonth < 1 )\n"
373 " *year+= nNewMonth / 12 - 1 ;\n"
374 " *nMonth = nNewMonth % 12 + 12 ;\n"
377 " *nMonth = nNewMonth ;\n"
380 " *nDay = min( nOrigDay, 30);\n"
381 " if( bLastDay || (*nDay >= DaysInMonth( *nMonth, *year )) )\n"
386 " int nLastDay = DaysInMonth( *nMonth, *year );\n"
387 " *nDay = bLastDay ? nLastDay : min( nOrigDay, nLastDay );\n"
392 "int getDaysInMonthRange( int nFrom, int nTo,int b30Days,int year);\n";
395 "int getDaysInMonthRange( int nFrom, int nTo,int b30Days,int year)\n"
397 " if( nFrom > nTo )\n"
401 " nRet = (nTo - nFrom + 1) * 30;\n"
404 " for( int nMonthIx = nFrom; nMonthIx <= nTo; ++nMonthIx )\n"
405 " nRet += b30Days ? 30 : DaysInMonth( nMonthIx, year );\n"
411 "int GetDaysInYears( int nYear1, int nYear2 );\n";
414 "int GetDaysInYears( int nYear1, int nYear2 )\n"
417 " for( int n = nYear1 ; n <= nYear2 ; n++ )\n"
419 " if( IsLeapYear( n ) )\n"
431 "int GetDaysInYear( int nNullDate, int nDate, int nMode );\n";
434 "int GetDaysInYear( int nNullDate, int nDate, int nMode )\n"
444 " int nD=0, nM=0, nY=0;\n"
445 " nDate += nNullDate;\n"
446 " DaysToDate( nDate, &nD, &nM, &nY );\n"
447 " return IsLeapYear( nY )? 366 : 365;\n"
455 "int getDaysInYearRange( int nFrom, int nTo,int b30Days );\n";
458 "int getDaysInYearRange( int nFrom, int nTo,int b30Days )\n"
460 " if( nFrom > nTo )\n"
462 " return b30Days ? ((nTo - nFrom + 1) * 360) : GetDaysInYears( nFrom, nTo)"
467 "int getDiff(int rFrom,int rTo,int fDay,int fMonth,int fYear,int fbLastDayMode,"
468 "int fbLastDay,int fb30Days,int fbUSMode,int fnDay,int tDay,int tMonth,"
469 "int tYear,int tbLastDayMode,int tbLastDay,int tb30Days,"
470 "int tbUSMode,int tnDay);\n";
473 "int getDiff(int rFrom,int rTo,int fDay,int fMonth,int fYear,int fbLastDayMode,"
474 "int fbLastDay,int fb30Days,int fbUSMode,int fnDay,int tDay,int tMonth,"
475 "int tYear,int tbLastDayMode,int tbLastDay,int tb30Days,"
476 "int tbUSMode,int tnDay)\n"
480 " int d=fDay;fDay=tDay;tDay=d;\n"
481 " int m=fMonth;fMonth=tMonth;tMonth=m;\n"
482 " int y=fYear;fYear=tYear;tYear=y;\n"
483 " int a=fbLastDayMode;fbLastDayMode=tbLastDayMode;tbLastDayMode=a;\n"
484 " int b=fbLastDay;fbLastDay=tbLastDay;tbLastDay=b;\n"
485 " int c=fb30Days;fb30Days=tb30Days;tb30Days=c;\n"
486 " int e=fbUSMode;fbUSMode=tbUSMode;tbUSMode=e;\n"
487 " int f=fnDay;fnDay=tnDay;tnDay=f;\n"
494 " if( ((fMonth == 2) || (fnDay < 30)) && (tDay == 31) )\n"
496 " else if( (tMonth == 2) && tbLastDay )\n"
497 " tnDay = DaysInMonth( 2, tYear );\n"
501 " if( (fMonth == 2) && (fnDay == 30) )\n"
502 " fnDay = DaysInMonth( 2, fYear );\n"
503 " if( (tMonth == 2) && (tnDay == 30) )\n"
504 " tnDay = DaysInMonth( 2, tYear );\n"
507 " if( (fYear < tYear) || ((fYear == tYear) && (fMonth < tMonth)) )\n"
509 " int d = fb30Days ? 30:DaysInMonth(fMonth,fYear);\n"
510 " nDiff = d- fnDay + 1;\n"
511 " fDay = fnDay = 1;\n"
513 " addMonths(fb30Days,fbLastDay,&fnDay,fDay,&fMonth,1,&fYear);\n"
514 " if( fYear < tYear )\n"
516 " nDiff += getDaysInMonthRange( fMonth, 12,fb30Days,fYear);\n"
517 " addMonths(fb30Days,fbLastDay,&fnDay,fDay,&fMonth,13-fMonth,&fYear"
519 " nDiff += getDaysInYearRange( fYear, tYear - 1,fb30Days);\n"
520 " fYear+=tYear - fYear;\n"
522 " nDiff += getDaysInMonthRange(fMonth, tMonth - 1,fb30Days ,fYear );\n"
523 " addMonths(fb30Days,fbLastDay,&fnDay,fDay,&fMonth,tMonth-fMonth,&fYear"
526 " nDiff += tnDay - fnDay;\n"
527 " return nDiff > 0 ? nDiff : 0;\n"
531 "int lcl_Getcoupdaybs(int nNullDate,int nSettle, int nMat,int nFreq,int nBase);\n";
534 "int lcl_Getcoupdaybs(int nNullDate,int nSettle, int nMat,int nFreq,int nBase)\n"
536 " int aDate = nMat;\n"
537 " int rDay=0,rMonth=0, rYear=0;int mDay=0,mMonth=0, mYear=0;int sDay=0,"
538 "sMonth=0, sYear=0;\n"
539 " int rbLastDayMode=0, rbLastDay=0,rb30Days=0,rbUSMode=0,rnDay=0;\n"
540 " int sbLastDayMode=0, sbLastDay=0,sb30Days=0,sbUSMode=0,snDay=0;\n"
541 " ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,&"
542 "rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
543 " ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,&"
544 "sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
546 " nSettle=nSettle+nNullDate;\n"
547 " aDate=DateToDays( rDay,rMonth,rYear );\n"
548 " if( aDate < nSettle )\n"
551 " aDate=DateToDays( rDay,rMonth,rYear );\n"
553 " while(aDate > nSettle )\n"
555 " addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,-1*(12/nFreq),&rYear"
557 " aDate=DateToDays( rDay,rMonth,rYear );\n"
559 " return getDiff( aDate, nSettle, rDay, rMonth, rYear, rbLastDayMode, "
560 "rbLastDay, rb30Days, rbUSMode, rnDay, sDay, sMonth, sYear, sbLastDayMode,"
561 "sbLastDay, sb30Days, sbUSMode, snDay);\n"
565 "int lcl_Getcoupdaybs_new(int nNullDate,int nSettle,int nMat,int nFreq,"
569 "int lcl_Getcoupdaybs_new(int nNullDate,int nSettle,int nMat,int nFreq,"
572 " int aDate = nMat;\n"
573 " int rDay=0,rMonth=0, rYear=0,rbLastDayMode=0, rbLastDay=0,rb30Days=0,"
574 "rbUSMode=0,rnDay=0;\n"
575 " int sDay=0,sMonth=0, sYear=0,sbLastDayMode=0, sbLastDay=0,sb30Days=0,"
576 "sbUSMode=0,snDay=0;\n"
577 " ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,"
578 "&sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
579 " ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,"
580 "&rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
582 " setDay(rDay,rMonth,rYear,rbLastDay,rb30Days,&rnDay);\n"
583 " aDate=DateToDays_new( rnDay,rMonth,rYear);\n"
584 " if(checklessthan(rYear,sYear,rMonth,sMonth,rnDay,snDay,rbLastDay,"
585 "sbLastDay,rDay,sDay))\n"
588 " setDay(rDay,rMonth,rYear,rbLastDay,rb30Days,&rnDay);\n"
589 " aDate=DateToDays_new( rnDay,rMonth,rYear );\n"
591 " while(checklessthan(sYear,rYear,sMonth,rMonth,snDay,rnDay,sbLastDay,"
592 "rbLastDay,sDay,rDay))\n"
594 " double d = -1*(12/nFreq);\n"
595 " addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,d,&rYear);\n"
596 " aDate=DateToDays_new( rnDay,rMonth,rYear );\n"
598 " return getDiff( aDate,nSettle+nNullDate,rDay,rMonth,rYear,rbLastDayMode,"
599 "rbLastDay,rb30Days,rbUSMode,rnDay,sDay,sMonth,sYear,sbLastDayMode,sbLastDay,"
600 "sb30Days,sbUSMode, snDay);\n"
604 "int lcl_Getcoupdays(int nNullDate,int nSettle, "
605 "int nMat,int nFreq,int nBase);\n";
608 "int lcl_Getcoupdays(int nNullDate,int nSettle, "
609 "int nMat,int nFreq,int nBase)\n"
611 " int aDate = nMat;\n"
612 " int rDay=0,rMonth=0, rYear=0;int mDay=0,mMonth=0, mYear=0;int sDay=0,"
613 "sMonth=0, sYear=0;\n"
614 " int rbLastDayMode=0, rbLastDay=0,rb30Days=0,rbUSMode=0,rnDay=0;\n"
615 " int sbLastDayMode=0, sbLastDay=0,sb30Days=0,sbUSMode=0,snDay=0;\n"
616 " ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,&"
617 "rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
618 " ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,&"
619 "sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
621 " nSettle=nSettle+nNullDate;\n"
622 " aDate=DateToDays( rDay,rMonth,rYear );\n"
623 " if( aDate < nSettle )\n"
626 " aDate=DateToDays( rDay,rMonth,rYear );\n"
628 " while(aDate > nSettle )\n"
630 " addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,-1*(12/nFreq),&rYear"
632 " aDate=DateToDays( rDay,rMonth,rYear );\n"
634 " int aNextDate=aDate;int aDay=rDay,aMonth=rMonth, aYear=rYear;\n"
635 " int abLastDayMode=rbLastDayMode, abLastDay=rbLastDay,ab30Days=rb30Days,"
636 "abUSMode=rbUSMode,anDay=rnDay;\n"
637 " addMonths(ab30Days,abLastDay,&anDay,aDay,&aMonth,12/nFreq,&aYear);\n"
638 " return getDiff( aDate, aNextDate, rDay, rMonth, rYear, rbLastDayMode, "
639 "rbLastDay, rb30Days, rbUSMode, rnDay, aDay, aMonth, aYear, abLastDayMode,"
640 "abLastDay, ab30Days, abUSMode, anDay);\n"
644 "int lcl_Getcoupdays_new(int nNullDate,int nSettle, "
645 "int nMat,int nFreq,int nBase);\n";
648 "int lcl_Getcoupdays_new(int nNullDate,int nSettle, "
649 "int nMat,int nFreq,int nBase)\n"
651 " int aDate = nMat;\n"
652 " int rDay=0,rMonth=0, rYear=0,rbLastDayMode=0, rbLastDay=0,rb30Days=0,"
653 "rbUSMode=0,rnDay=0;\n"
654 " int sDay=0,sMonth=0, sYear=0,sbLastDayMode=0, sbLastDay=0,sb30Days=0,"
655 "sbUSMode=0,snDay=0;\n"
656 " ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,"
657 "&sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
658 " ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,"
659 "&rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
661 " setDay(rDay,rMonth,rYear,rbLastDay,rb30Days,&rnDay);\n"
662 " aDate=DateToDays_new( rnDay,rMonth,rYear);\n"
663 " if(checklessthan(rYear,sYear,rMonth,sMonth,rnDay,snDay,rbLastDay,"
664 "sbLastDay,rDay,sDay))\n"
667 " setDay(rDay,rMonth,rYear,rbLastDay,rb30Days,&rnDay);\n"
668 " aDate=DateToDays_new( rnDay,rMonth,rYear );\n"
670 " while(checklessthan(sYear,rYear,sMonth,rMonth,snDay,rnDay,sbLastDay,"
671 "rbLastDay,sDay,rDay))\n"
673 " double d = -1*12*pow((double)nFreq,-1.0);\n"
674 " addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,d,&rYear);\n"
675 " aDate=DateToDays_new( rnDay,rMonth,rYear );\n"
677 " int aNextDate=aDate;int aDay=rDay,aMonth=rMonth, aYear=rYear;\n"
678 " int abLastDayMode=rbLastDayMode, abLastDay=rbLastDay,ab30Days=rb30Days,"
679 "abUSMode=rbUSMode,anDay=rnDay;\n"
680 " int tmp = (int)(12*pow((double)nFreq,-1.0));\n"
681 " addMonths(ab30Days,abLastDay,&anDay,aDay,&aMonth,tmp,&aYear);\n"
682 " return getDiff( aDate, aNextDate, rDay, rMonth, rYear, rbLastDayMode, "
683 "rbLastDay, rb30Days, rbUSMode, rnDay, aDay, aMonth, aYear, abLastDayMode,"
684 "abLastDay, ab30Days, abUSMode, anDay);\n"
688 "int lcl_Getcoupnum(int nNullDate,int nSettle, int nMat,int nFreq);\n";
691 "int lcl_Getcoupnum(int nNullDate,int nSettle, int nMat,int nFreq)\n"
693 " int aDate = nMat;int rDay=0,rMonth=0, rYear=0;int mDay=0,mMonth=0, mYear="
695 " int sDay=0,sMonth=0, sYear=0;\n"
696 " DaysToDate(aDate+nNullDate,&rDay, &rMonth, &rYear );\n"
697 " DaysToDate(nMat+nNullDate,&mDay, &mMonth, &mYear );\n"
698 " DaysToDate(nSettle+nNullDate,&sDay, &sMonth, &sYear );\n"
700 " nSettle=nSettle+nNullDate;\n"
701 " aDate=DateToDays( rDay,rMonth,rYear );\n"
702 " if( aDate < nSettle )\n"
704 " int d=DateToDays( rDay,rMonth,rYear );\n"
705 " int nMonthCount=-1*(12 / nFreq);\n"
706 " while(d > nSettle )\n"
708 " int nNewMonth = nMonthCount + rMonth;\n"
709 " if( nNewMonth > 12 )\n"
712 " rYear+=nNewMonth / 12;\n"
713 " rMonth = nNewMonth % 12 + 1;\n"
715 " else if( nNewMonth < 1 )\n"
717 " rYear+= nNewMonth / 12 - 1;\n"
718 " rMonth = nNewMonth % 12 + 12;\n"
721 " rMonth = nNewMonth;\n"
722 " d=DateToDays( rDay,rMonth,rYear );\n"
724 " int n=(mYear-rYear)*12+mMonth-rMonth;\n"
729 "double lcl_Getcoupnum_new(int nNullDate,int nSettle,int nMat,int nFreq,int"
732 "double lcl_Getcoupnum_new(int nNullDate,int nSettle, int nMat,int nFreq,int"
735 " int aDate = nMat;\n"
736 " int mDay=0,mMonth=0, mYear=0;\n"
737 " int rDay=0,rMonth=0, rYear=0,rbLastDayMode=0, rbLastDay=0,rb30Days=0,"
738 "rbUSMode=0,rnDay=0;\n"
739 " int sDay=0,sMonth=0, sYear=0,sbLastDayMode=0, sbLastDay=0,sb30Days=0,"
740 "sbUSMode=0,snDay=0;\n"
741 " ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,"
742 "&sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
743 " ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,"
744 "&rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
745 " mMonth = rMonth, mYear = rYear;\n"
747 " setDay(rDay,rMonth,rYear,rbLastDay,rb30Days,&rnDay);\n"
748 " if(checklessthan(rYear,sYear,rMonth,sMonth,rnDay,snDay,rbLastDay,"
749 "sbLastDay,rDay,sDay))\n"
752 " setDay(rDay,rMonth,rYear,rbLastDay,rb30Days,&rnDay);\n"
754 " int m= checklessthan(sYear,rYear,sMonth,rMonth,snDay,rnDay,sbLastDay,"
755 "rbLastDay,sDay,rDay);\n"
758 " double d = -1*(12/nFreq);\n"
759 " addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,d,&rYear);\n"
760 " m = checklessthan(sYear,rYear,sMonth,rMonth,snDay,rnDay,sbLastDay,"
761 "rbLastDay,sDay,rDay);\n"
763 " int n=(mYear-rYear)*12+mMonth-rMonth;\n"
764 " double tmp = (double)(n*nFreq)/12.0;\n"
769 "void setDay(int nOrigDay, int nMonth,int nYear,int bLastDay,int b30Days,"
772 "void setDay(int nOrigDay, int nMonth,int nYear,int bLastDay,int b30Days,"
777 " *nDay = min( nOrigDay, 30);\n"
778 " if( bLastDay || (*nDay >= DaysInMonth( nMonth, nYear )) )\n"
783 " int nLastDay = DaysInMonth( nMonth, nYear );\n"
784 " *nDay = bLastDay ? nLastDay : min( nOrigDay, nLastDay );\n"
789 "double coupdays(int nSettle,int nMat,int nFreq,int nBase);\n";
792 "double coupdays(int nSettle,int nMat,int nFreq,int nBase)\n"
794 " int nNullDate=GetNullDate();\n"
795 " if( nBase == 1 )\n"
796 " return lcl_Getcoupdays(nNullDate, nSettle, nMat,nFreq, nBase);\n"
798 " return (double)GetDaysInYear(0,0,nBase)/nFreq;\n"
801 "double coupdays_new(int nSettle,int nMat,int nFreq,int nBase);\n";
804 "double coupdays_new(int nSettle,int nMat,int nFreq,int nBase)\n"
806 " int nNullDate=693594;\n"
807 " if( nBase == 1 )\n"
808 " return lcl_Getcoupdays_new(nNullDate, nSettle, nMat,nFreq, nBase);\n"
810 " return (double)GetDaysInYear(0,0,nBase)*pow((double)nFreq,-1.0);\n"
814 "double coupdaybs( int nSettle,int nMat,int nFreq,int nBase);\n";
817 "double coupdaybs( int nSettle,int nMat,int nFreq,int nBase)\n"
819 " int nNullDate=GetNullDate();\n"
820 " return lcl_Getcoupdaybs(nNullDate, nSettle, nMat,nFreq, nBase);\n"
824 "double coupdaybs_new( int nSettle,int nMat,int nFreq,int nBase);\n";
827 "double coupdaybs_new( int nSettle,int nMat,int nFreq,int nBase)\n"
829 " int nNullDate=693594;\n"
830 " return lcl_Getcoupdaybs_new(nNullDate, nSettle, nMat,nFreq, nBase);\n"
834 "double coupdaysnc( int nSettle,int nMat,int nFreq,int nBase);\n";
837 "double coupdaysnc( int nSettle,int nMat,int nFreq,int nBase)\n"
839 " int nNullDate=GetNullDate();\n"
840 " if((nBase != 0) && (nBase != 4))\n"
842 " int aDate = nMat;\n"
843 " int rDay=0,rMonth=0, rYear=0;int mDay=0,mMonth=0, mYear=0;int sDay=0,"
844 "sMonth=0, sYear=0;\n"
845 " int rbLastDayMode=0, rbLastDay=0,rb30Days=0,rbUSMode=0,rnDay=0;\n"
846 " int sbLastDayMode=0, sbLastDay=0,sb30Days=0,sbUSMode=0,snDay=0;\n"
847 " ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,&"
848 "rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
849 " ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,"
850 "&sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
852 " nSettle=nSettle+nNullDate;\n"
853 " aDate=DateToDays( rDay,rMonth,rYear );\n"
854 " if( aDate > nSettle )\n"
857 " aDate=DateToDays( rDay,rMonth,rYear );\n"
859 " while(aDate <= nSettle )\n"
861 " addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,12/nFreq,&rYear)"
863 " aDate=DateToDays( rDay,rMonth,rYear );\n"
865 " return getDiff( nSettle, aDate, sDay, sMonth, sYear, sbLastDayMode, "
866 "sbLastDay, sb30Days, sbUSMode, snDay, rDay, rMonth, rYear, rbLastDayMode, "
867 "rbLastDay, rb30Days, rbUSMode, rnDay);\n"
870 " return coupdays(nSettle,nMat,nFreq,nBase)- coupdaybs( nSettle,nMat,"
874 "double coupdaysnc_new( int nSettle,int nMat,int nFreq,int nBase);\n";
877 "double coupdaysnc_new( int nSettle,int nMat,int nFreq,int nBase)\n"
879 " int nNullDate=693594;\n"
880 " if((nBase != 0) && (nBase != 4))\n"
882 " int aDate = nMat;\n"
883 " int rDay=0,rMonth=0, rYear=0,rbLastDayMode=0, rbLastDay=0,rb30Days=0,"
884 "rbUSMode=0,rnDay=0;\n"
885 " int sDay=0,sMonth=0, sYear=0,sbLastDayMode=0, sbLastDay=0,sb30Days=0,"
886 "sbUSMode=0,snDay=0;\n"
887 " ScaDate( nNullDate,aDate,nBase,&rDay,&rMonth,&rYear,&rbLastDayMode,"
888 "&rbLastDay,&rb30Days,&rbUSMode,&rnDay);\n"
889 " ScaDate( nNullDate,nSettle,nBase,&sDay,&sMonth,&sYear,&sbLastDayMode,"
890 "&sbLastDay,&sb30Days,&sbUSMode,&snDay);\n"
892 " setDay(rDay,rMonth,rYear,rbLastDay,rb30Days,&rnDay);\n"
893 " aDate=DateToDays( rnDay,rMonth,rYear);\n"
894 " if(checklessthan(sYear,rYear,sMonth,rMonth,snDay,rnDay,sbLastDay,rbLastDay"
898 " setDay(rDay,rMonth,rYear,rbLastDay,rb30Days,&rnDay);\n"
899 " aDate=DateToDays( rnDay,rMonth,rYear );\n"
901 " while(!checklessthan(sYear,rYear,sMonth,rMonth,snDay,rnDay,sbLastDay,"
902 "rbLastDay,sDay,rDay))\n"
904 " addMonths(rb30Days,rbLastDay,&rnDay,rDay,&rMonth,12/nFreq,&rYear);\n"
905 " aDate=DateToDays( rnDay,rMonth,rYear );\n"
907 " return getDiff( nSettle+nNullDate,aDate,sDay,sMonth,sYear,sbLastDayMode, "
908 "sbLastDay, sb30Days, sbUSMode, snDay, rDay, rMonth, rYear, rbLastDayMode, "
909 "rbLastDay, rb30Days, rbUSMode, rnDay);\n"
912 " return coupdays_new(nSettle,nMat,nFreq,nBase)- coupdaybs_new( nSettle,"
913 "nMat,nFreq,nBase);\n"
917 "int checklessthan(int aYear,int bYear,int aMonth,int bMonth,int anDay,int "
918 "bnDay,int abLastDay,int bbLastDay,int anOrigDay,int bnOrigDay);\n";
920 "int checklessthan(int aYear,int bYear,int aMonth,int bMonth,int anDay,int "
921 "bnDay,int abLastDay,int bbLastDay,int anOrigDay,int bnOrigDay)\n"
923 " if( aYear != bYear )\n"
924 " return aYear < bYear;\n"
925 " if( aMonth != bMonth )\n"
926 " return aMonth < bMonth;\n"
927 " if( anDay != bnDay )\n"
928 " return anDay < bnDay;\n"
929 " if( abLastDay || bbLastDay )\n"
930 " return !abLastDay && bbLastDay;\n"
931 " return anOrigDay < bnOrigDay;\n"
935 "double coupnum( int nSettle,int nMat,int nFreq,int nBase);\n";
938 "double coupnum( int nSettle,int nMat,int nFreq,int nBase)\n"
940 " int nNullDate=GetNullDate();\n"
941 " return lcl_Getcoupnum(nNullDate,nSettle,nMat,nFreq);\n"
944 "double coupnum_new( int nSettle,int nMat,int nFreq,int nBase);\n";
947 "double coupnum_new( int nSettle,int nMat,int nFreq,int nBase)\n"
949 " int nNullDate=693594;\n"
950 " return lcl_Getcoupnum_new(nNullDate,nSettle,nMat,nFreq,nBase);\n"
954 "double getPrice_(int nSettle, int nMat, double fRate, double fYield,\n"
955 "double fRedemp, int nFreq, int nBase );\n";
958 "double getPrice_(int nSettle, int nMat, double fRate, double fYield,\n"
959 "double fRedemp, int nFreq, int nBase )\n"
961 " double fFreq = nFreq;\n"
962 " double fE = coupdays( nSettle, nMat, nFreq, nBase );\n"
963 " double fDSC_E = coupdaysnc( nSettle, nMat, nFreq, nBase ) / fE;\n"
964 " double fN = coupnum( nSettle, nMat, nFreq, nBase );\n"
965 " double fA = coupdaybs( nSettle, nMat, nFreq, nBase );\n"
966 " double fRet = fRedemp / ( pow( 1.0 + fYield / fFreq, fN - 1.0 + "
968 " fRet -= 100.0 * fRate / fFreq * fA / fE;\n"
969 " double fT1 = 100.0 * fRate / fFreq;\n"
970 " double fT2 = 1.0 + fYield / fFreq;\n"
971 " for( double fK = 0.0 ; fK < fN ; fK+=1.0 )\n"
972 " fRet += fT1 / pow( fT2, fK + fDSC_E );\n"
976 "double getPrice_(int nSettle, int nMat, double fRate, double fYield,\n"
977 "double fRedemp, int nFreq, int nBase );\n";
980 "double getPrice_(int nSettle, int nMat, double fRate, double fYield,\n"
981 "double fRedemp, int nFreq, int nBase )\n"
983 " double fFreq = nFreq;\n"
984 " double fE = coupdays_new( nSettle, nMat, nFreq, nBase );\n"
985 " double fDSC_E = coupdaysnc_new( nSettle, nMat, nFreq, nBase ) / fE;\n"
986 " double fN = coupnum_new( nSettle, nMat, nFreq, nBase );\n"
987 " double fA = coupdaybs_new( nSettle, nMat, nFreq, nBase );\n"
988 " double fRet = fRedemp / ( pow( 1.0 + fYield / fFreq, fN - 1.0 + "
990 " fRet -= 100.0 * fRate / fFreq * fA / fE;\n"
991 " double fT1 = 100.0 * fRate / fFreq;\n"
992 " double fT2 = 1.0 + fYield / fFreq;\n"
993 " for( double fK = 0.0 ; fK < fN ; fK+=1.0 )\n"
994 " fRet += fT1 / pow( fT2, fK + fDSC_E );\n"
999 "double getYield_( int nNullDate, int nSettle, int nMat, double fCoup,"
1000 "double fPrice,double fRedemp, int nFreq, int nBase);\n";
1003 "double getYield_( int nNullDate, int nSettle, int nMat, double fCoup,"
1004 "double fPrice,double fRedemp, int nFreq, int nBase )\n"
1006 " double fRate = fCoup;\n"
1007 " double fPriceN = 0.0;\n"
1008 " double fYield1 = 0.0;\n"
1009 " double fYield2 = 1.0;\n"
1010 " double fPrice1 = getPrice_(nSettle, nMat, fRate, fYield1, fRedemp, "
1012 " double fPrice2 = getPrice_(nSettle, nMat, fRate, fYield2, fRedemp, "
1014 " double fYieldN = ( fYield2 - fYield1 ) * 0.5;\n"
1015 " for( unsigned int nIter = 0 ; nIter < 100 && fPriceN != fPrice ; nIter++ "
1018 " fPriceN = getPrice_(nSettle, nMat, fRate, fYieldN, fRedemp, nFreq, "
1020 " if( fPrice == fPrice1 )\n"
1021 " return fYield1;\n"
1022 " else if( fPrice == fPrice2 )\n"
1023 " return fYield2;\n"
1024 " else if( fPrice == fPriceN )\n"
1025 " return fYieldN;\n"
1026 " else if( fPrice < fPrice2 )\n"
1028 " fYield2 *= 2.0;\n"
1029 " fPrice2 = getPrice_(nSettle, nMat, fRate, fYield2, fRedemp, nFreq"
1031 " fYieldN = ( fYield2 - fYield1 ) * 0.5;\n"
1035 " if( fPrice < fPriceN )\n"
1037 " fYield1 = fYieldN;\n"
1038 " fPrice1 = fPriceN;\n"
1042 " fYield2 = fYieldN;\n"
1043 " fPrice2 = fPriceN;\n"
1045 " fYieldN = fYield2 - ( fYield2 - fYield1 ) * ( ( fPrice - fPrice2 "
1046 ") / ( fPrice1 - fPrice2 ) );\n"
1049 " return fYieldN;\n"
1053 "double GetYearFrac( int nNullDate, int nStartDate, int nEndDate,"
1057 "double GetYearFrac( int nNullDate, int nStartDate, int nEndDate,"
1060 " if( nStartDate == nEndDate )\n"
1063 " if( nStartDate > nEndDate )\n"
1065 " int n = nEndDate;\n"
1066 " nEndDate = nStartDate;\n"
1067 " nStartDate = n;\n"
1070 " int nDate1 = nStartDate + nNullDate;\n"
1071 " int nDate2 = nEndDate + nNullDate;\n"
1073 " int nDay1, nDay2;\n"
1074 " int nMonth1, nMonth2;\n"
1075 " int nYear1, nYear2;\n"
1077 " DaysToDate( nDate1, &nDay1, &nMonth1, &nYear1 );\n"
1078 " DaysToDate( nDate2, &nDay2, &nMonth2, &nYear2 );\n"
1081 " switch( nMode )\n"
1084 " if ( nDay1 == 31 )\n"
1088 " if ( nDay1 == 30 && nDay2 == 31 )\n"
1094 " if ( nMonth1 == 2 && nDay1 == "
1095 "( IsLeapYear( nYear1 ) ? 29 : 28 ) )\n"
1098 " if ( nMonth2 == 2 && nDay2 == "
1099 "( IsLeapYear( nYear2 ) ? 29 : 28 ) )\n"
1105 " nDayDiff = ( nYear2 - nYear1 ) * 360 + "
1106 "( nMonth2 - nMonth1 ) * 30 + ( nDay2 - nDay1 );\n"
1111 " nDayDiff = nDate2 - nDate1;\n"
1114 " if ( nDay1 == 31 )\n"
1118 " if ( nDay2 == 31 )\n"
1122 " nDayDiff = ( nYear2 - nYear1 ) * 360 + "
1123 "( nMonth2 - nMonth1 ) * 30 + ( nDay2 - nDay1 );\n"
1127 " double nDaysInYear;\n"
1128 " switch( nMode )\n"
1133 " nDaysInYear = 360;\n"
1137 " bool isYearDifferent = ( nYear1 != nYear2 );\n"
1138 " if ( isYearDifferent &&\n"
1139 " ( ( nYear2 != nYear1 + 1 ) ||\n"
1140 " ( nMonth1 < nMonth2 ) ||\n"
1141 " ( nMonth1 == nMonth2 && nDay1 < nDay2 ) ) )\n"
1144 " int nDayCount = 0;\n"
1145 " for ( int i = nYear1; i <= nYear2; i++ )\n"
1146 " nDayCount += ( IsLeapYear( i ) ? 366 : 365 );\n"
1148 " nDaysInYear = ( double ) nDayCount / "
1149 "( double ) ( nYear2 - nYear1 + 1 );\n"
1153 " if ( isYearDifferent && IsLeapYear( nYear1 ) )\n"
1155 " nDaysInYear = 366;\n"
1160 " if ( ( IsLeapYear( nYear1 ) && nMonth1 <= 2 "
1161 "&& nDay1 <= 29 ) ||\n"
1162 " ( IsLeapYear( nYear2 ) && ( nMonth2 > 3 || "
1163 "( nMonth2 == 2 && nDay1 == 29 ) ) ) )\n"
1165 " nDaysInYear = 366;\n"
1169 " nDaysInYear = 365;\n"
1170 " for ( int i = nYear1; i <= nYear2; i++ )\n"
1172 " if ( IsLeapYear( i ) )\n"
1174 " nDaysInYear = 366;\n"
1184 " nDaysInYear = 365;\n"
1187 " return (double)( nDayDiff ) / (nDaysInYear);\n"
1191 "double GetYieldmat( int nNullDate, int nSettle, int nMat, int nIssue,\n"
1192 "double fRate, double fPrice, int nBase );\n";
1195 "double GetYieldmat( int nNullDate, int nSettle, int nMat, int nIssue,\n"
1196 "double fRate, double fPrice, int nBase )\n"
1198 " double fIssMat = GetYearFrac_new( nNullDate, nIssue, nMat, nBase );\n"
1199 " double fIssSet = GetYearFrac_new( nNullDate, nIssue, nSettle, nBase );\n"
1200 " double fSetMat = GetYearFrac_new( nNullDate, nSettle, nMat, nBase );\n"
1201 " double y = 1.0 + fIssMat * fRate;\n"
1202 " y =y * pow( (fPrice / 100.0 + fIssSet * fRate),-1);\n"
1204 " y = y * pow(fSetMat,-1);\n"
1209 "int GetDiffDate( int nNullDate, int nStartDate, int nEndDate, int nMode,"
1210 " int* pOptDaysIn1stYear );\n";
1213 "int GetDiffDate( int nNullDate, int nStartDate, int nEndDate, int nMode,"
1214 " int* pOptDaysIn1stYear )\n"
1216 " bool bNeg = nStartDate > nEndDate;\n"
1219 " int n = nEndDate;\n"
1220 " nEndDate = nStartDate;\n"
1221 " nStartDate = n;\n"
1224 " switch( nMode )\n"
1229 " int nD1, nM1, nY1, nD2, nM2, nY2;\n"
1230 " nStartDate += nNullDate;\n"
1231 " nEndDate += nNullDate;\n"
1232 " DaysToDate( nStartDate, &nD1, &nM1, &nY1 );\n"
1233 " DaysToDate( nEndDate, &nD2, &nM2, &nY2 );\n"
1234 " bool bLeap = IsLeapYear( nY1 );\n"
1235 " int nDays, nMonths;\n"
1236 " nMonths = nM2 - nM1;\n"
1237 " nDays = nD2 - nD1;\n"
1238 " nMonths += ( nY2 - nY1 ) * 12;\n"
1239 " nRet = nMonths * 30 + nDays;\n"
1240 " if( nMode == 0 && nM1 == 2 && nM2 != 2 && nY1 == nY2 )\n"
1241 " nRet -= bLeap? 1 : 2;\n"
1242 " if( pOptDaysIn1stYear )\n"
1243 " *pOptDaysIn1stYear = 360;\n"
1247 " if( pOptDaysIn1stYear )\n"
1249 " int nD, nM, nY;\n"
1250 " DaysToDate( nStartDate + nNullDate, &nD, &nM, &nY );\n"
1251 " *pOptDaysIn1stYear = IsLeapYear( nY )? 366 : 365;\n"
1253 " nRet = nEndDate - nStartDate;\n"
1256 " nRet = nEndDate - nStartDate;\n"
1257 " if( pOptDaysIn1stYear )\n"
1258 " *pOptDaysIn1stYear = 360;\n"
1261 " nRet = nEndDate - nStartDate;\n"
1262 " if( pOptDaysIn1stYear )\n"
1263 " *pOptDaysIn1stYear = 365;\n"
1266 " return bNeg? -nRet : nRet;\n"
1270 "double GetYearDiff( int nNullDate, int nStartDate, int nEndDate,"
1274 "double GetYearDiff( int nNullDate, int nStartDate, int nEndDate,"
1277 " int nDays1stYear;\n"
1278 " int nTotalDays = GetDiffDate( nNullDate, nStartDate, nEndDate,"
1281 " return (double)(nTotalDays)*pow((double)nDays1stYear,-1);\n"
1285 "int GetDiffDate360_(\n"
1286 " int nDay1, int nMonth1, int nYear1, bool bLeapYear1,\n"
1287 " int nDay2, int nMonth2, int nYear2,\n"
1288 " bool bUSAMethod );\n";
1291 "int GetDiffDate360_(\n"
1292 " int nDay1, int nMonth1, int nYear1, bool bLeapYear1,\n"
1293 " int nDay2, int nMonth2, int nYear2,\n"
1294 " bool bUSAMethod )\n"
1296 " if( nDay1 == 31 )\n"
1298 " else if( bUSAMethod && ( nMonth1 == 2 && ( nDay1 == 29 || ( nDay1 == 28 "
1299 "&& !bLeapYear1 ) ) ) )\n"
1301 " if( nDay2 == 31 )\n"
1303 " if( bUSAMethod && nDay1 != 30 )\n"
1306 " if( nMonth2 == 12 )\n"
1317 " return nDay2 + nMonth2 * 30 + nYear2 * 360 - nDay1 - nMonth1 * 30 - "
1322 "int GetDiffDate360( int nNullDate, int nDate1, int nDate2,"
1323 "bool bUSAMethod);\n";
1326 "int GetDiffDate360( int nNullDate, int nDate1, int nDate2,"
1327 "bool bUSAMethod )\n"
1329 " nDate1 += nNullDate;\n"
1330 " nDate2 += nNullDate;\n"
1331 " int nDay1, nMonth1, nYear1, nDay2, nMonth2, nYear2;\n"
1332 " DaysToDate( nDate1, &nDay1, &nMonth1, &nYear1 );\n"
1333 " DaysToDate( nDate2, &nDay2, &nMonth2, &nYear2 );\n"
1334 " return GetDiffDate360_( nDay1, nMonth1, nYear1, IsLeapYear( nYear1 ), "
1335 "nDay2, nMonth2, nYear2, bUSAMethod );\n"
1339 "double GetDuration( \n"
1340 " int nNullDate, int nSettle, int nMat, double fCoup,\n"
1341 " double fYield, int nFreq, int nBase );\n";
1344 "double GetDuration( \n"
1345 " int nNullDate, int nSettle, int nMat, double fCoup,\n"
1346 " double fYield, int nFreq, int nBase )\n"
1348 " double fYearfrac = GetYearFrac( nNullDate, nSettle, nMat, nBase );\n"
1349 " double fNumOfCoups = lcl_Getcoupnum(nNullDate,nSettle,nMat,nFreq);\n"
1350 " double fDur = 0.0;\n"
1351 " double f100 = 100.0;\n"
1352 " fCoup *= f100 / nFreq;\n"
1353 " fYield /= nFreq;\n"
1355 " double nDiff = fYearfrac * nFreq - fNumOfCoups;\n"
1357 " for( t = 1 ; t < fNumOfCoups ; t++ )\n"
1358 " fDur += ( t + nDiff ) * ( fCoup ) / pow( fYield, t + nDiff );\n"
1359 " fDur += ( fNumOfCoups + nDiff ) * ( fCoup + f100 ) /"
1360 " pow( fYield, fNumOfCoups + nDiff );\n"
1361 " double p = 0.0;\n"
1362 " for( t = 1 ; t < fNumOfCoups ; t++ )\n"
1363 " p += fCoup / pow( fYield, t + nDiff );\n"
1364 " p += ( fCoup + f100 ) / pow( fYield, fNumOfCoups + nDiff );\n"
1367 " return fDur;\n""}\n";
1370 "double GetDuration_new( \n"
1371 " int nNullDate, int nSettle, int nMat, double fCoup,\n"
1372 " double fYield, int nFreq, int nBase );\n";
1375 "double GetDuration_new( \n"
1376 " int nNullDate, int nSettle, int nMat, double fCoup,\n"
1377 " double fYield, int nFreq, int nBase )\n"
1379 " double fYearfrac = GetYearFrac(nNullDate,nSettle,nMat,nBase);\n"
1380 " double fNumOfCoups = lcl_Getcoupnum_new(nNullDate,nSettle,nMat,"
1382 " double fDur = 0.0;\n"
1383 " fCoup = fCoup * 100.0 * pow(nFreq, -1.0);\n"
1384 " fYield = fYield * pow(nFreq, -1.0);\n"
1386 " double nDiff = fYearfrac * nFreq - fNumOfCoups;\n"
1388 " double tmp0 = 0, tmp1 = 0, tmp2 = 0;\n"
1389 " for( t = 1 ; t < fNumOfCoups ; t++ ){\n"
1390 " tmp0 = (t + nDiff) * ( fCoup ) ;\n"
1391 " tmp1 = pow( fYield, t + nDiff ) ;\n"
1392 " tmp2 = tmp0 * pow(tmp1, -1);\n"
1395 " fDur += (fNumOfCoups + nDiff) * (fCoup + 100.0) * pow(pow(fYield,"
1396 " fNumOfCoups + nDiff ),-1);\n"
1397 " double p = 0.0;\n"
1398 " for( t = 1 ; t < fNumOfCoups ; t++ ){\n"
1399 " tmp0 = pow( fYield, t + nDiff );\n"
1400 " p += fCoup * pow(tmp0, -1);}\n"
1401 " p += (fCoup + 100.0) * pow(pow(fYield, fNumOfCoups + nDiff), -1);\n"
1402 " fDur = fDur * pow(p, -1.0);\n"
1403 " fDur = fDur * pow(nFreq, -1.0);\n"
1408 "double ScGetDDB(double fCost, double fSalvage, double fLife, double fPeriod,"
1409 "double fFactor);\n";
1412 "double ScGetDDB(double fCost, double fSalvage, double fLife, double fPeriod,"
1415 " double fDdb, fRate, fOldValue, fNewValue;\n"
1416 " fRate = fFactor / fLife;\n"
1417 " if (fRate >= 1.0)\n"
1420 " if (fPeriod == 1.0)\n"
1421 " fOldValue = fCost;\n"
1423 " fOldValue = 0.0;\n"
1426 " fOldValue = fCost * pow(1.0 - fRate, fPeriod - 1.0);\n"
1427 " fNewValue = fCost * pow(1.0 - fRate, fPeriod);\n"
1429 " if (fNewValue < fSalvage)\n"
1430 " fDdb = fOldValue - fSalvage;\n"
1432 " fDdb = fOldValue - fNewValue;\n"
1433 " if (fDdb < 0.0)\n"
1439 "inline double DblMin( double a, double b );\n";
1442 "inline double DblMin( double a, double b )\n"
1444 " return (a < b) ? a : b;\n"
1448 "double ScInterVDB(double fCost, double fSalvage, double fLife, double fLife1,"
1449 "double fPeriod, double fFactor);\n";
1452 "double ScInterVDB(double fCost, double fSalvage, double fLife, double fLife1,"
1453 "double fPeriod, double fFactor)\n"
1456 " double fIntEnd = ceil(fPeriod);\n"
1457 " int nLoopEnd = fIntEnd;\n"
1459 " double fTerm, fSln;\n"
1460 " double fSalvageValue = fCost - fSalvage;\n"
1461 " int nNowSln = 0;\n"
1465 " for ( i = 1; i <= nLoopEnd; i++)\n"
1469 " fDdb = ScGetDDB(fCost, fSalvage, fLife, (double) i, fFactor);\n"
1470 " fSln = fSalvageValue/ (fLife1 - (double) (i-1));\n"
1471 " if (fSln > fDdb)\n"
1479 " fSalvageValue =fSalvageValue- fDdb;\n"
1487 " if ( i == nLoopEnd)\n"
1488 " fTerm *= ( fPeriod + 1.0 - fIntEnd );\n"
1496 "double VDBImplement(double fCost, double fSalvage, double fLife, double fStart"
1497 ", double fEnd, double fFactor, bool bNoSwitch);\n";
1500 "double VDBImplement(double fCost, double fSalvage, double fLife, double fStart"
1501 ", double fEnd, double fFactor, bool bNoSwitch)\n"
1503 " double result=0;\n"
1504 " double fIntStart = floor(fStart);\n"
1505 " double fIntEnd = ceil(fEnd);\n"
1506 " int nLoopStart = (int) fIntStart;\n"
1507 " int nLoopEnd = (int) fIntEnd;\n"
1510 " for (int i = nLoopStart + 1; i <= nLoopEnd; i++)\n"
1512 " double fTerm = ScGetDDB(fCost, fSalvage, fLife, (double) i, fFactor"
1514 " if ( i == nLoopStart+1 )\n"
1515 " fTerm *= ( DblMin( fEnd, fIntStart + 1.0 ) - fStart );\n"
1516 " else if ( i == nLoopEnd )\n"
1517 " fTerm *= ( fEnd + 1.0 - fIntEnd );\n"
1518 " result += fTerm;\n"
1523 " double fLife1=fLife;\n"
1524 " if(!isequal(fStart,floor(fStart)))\n"
1528 " if(fStart>fLife/2 || isequal(fStart,fLife/2))\n"
1530 " double fPart=fStart-fLife/2;\n"
1531 " fStart=fLife/2;\n"
1537 " fCost-=ScInterVDB(fCost, fSalvage, fLife, fLife1, fStart, fFactor);\n"
1538 " result=ScInterVDB(fCost, fSalvage, fLife, fLife-fStart, fEnd-fStart,"
1545 "double GetOddlprice( int nNullDate, int nSettle, int nMat, int nLastCoup,\n"
1546 " double fRate, double fYield, double fRedemp, int nFreq, int nBase );\n";
1549 "double GetOddlprice( int nNullDate, int nSettle, int nMat, int nLastCoup,\n"
1550 " double fRate, double fYield, double fRedemp, int nFreq, int nBase )\n"
1552 " double fFreq = nFreq ;\n"
1553 " double fDCi = GetYearFrac( nNullDate, nLastCoup,"
1554 "nMat, nBase ) * fFreq;\n"
1555 " double fDSCi = GetYearFrac( nNullDate, nSettle,"
1556 "nMat, nBase ) * fFreq;\n"
1557 " double fAi = GetYearFrac( nNullDate, nLastCoup,"
1558 "nSettle, nBase ) * fFreq;\n"
1559 " double p = fRedemp + fDCi * 100.0 * fRate / fFreq;\n"
1560 " p /= fDSCi * fYield / fFreq + 1.0;\n"
1561 " p -= fAi * 100.0 * fRate / fFreq;\n"
1566 "double GetOddlyield( int nNullDate, int nSettle, int nMat, int nLastCoup,\n"
1567 " double fRate, double fPrice, double fRedemp, int nFreq, int nBase );\n";
1570 "double GetOddlyield( int nNullDate, int nSettle, int nMat, int nLastCoup,\n"
1571 " double fRate, double fPrice, double fRedemp, int nFreq, int nBase ) \n"
1573 " double fFreq = nFreq ;\n"
1574 " double fDCi= GetYearFrac( nNullDate, nLastCoup, nMat, nBase ) * fFreq;\n"
1575 " double fDSCi= GetYearFrac( nNullDate, nSettle, nMat, nBase ) * fFreq;\n"
1576 " double fAi= GetYearFrac( nNullDate, nLastCoup, nSettle, nBase )*fFreq;\n"
1577 " double y = fRedemp + fDCi * 100.0 * fRate / fFreq;\n"
1578 " y /= fPrice + fAi * 100.0 * fRate / fFreq;\n"
1580 " y *= fFreq / fDSCi;\n"
1585 "double GetYearFrac_new( int nNullDate, int nStartDate, int nEndDate,"
1589 "double GetYearFrac_new( int nNullDate, int nStartDate, int nEndDate,"
1592 " if( nStartDate == nEndDate )\n"
1594 " if( nStartDate > nEndDate )\n"
1596 " int n = nEndDate;\n"
1597 " nEndDate = nStartDate;\n"
1598 " nStartDate = n;\n"
1600 " int nDate1 = nStartDate + nNullDate;\n"
1601 " int nDate2 = nEndDate + nNullDate;\n"
1602 " int nDay1, nDay2;\n"
1603 " int nMonth1, nMonth2;\n"
1604 " int nYear1, nYear2;\n"
1605 " DaysToDate_new( nDate1, &nDay1, &nMonth1, &nYear1 );\n"
1606 " DaysToDate_new( nDate2, &nDay2, &nMonth2, &nYear2 );\n"
1608 " switch( nMode )\n"
1611 " if ( nDay1 == 31 )\n"
1615 " if ( nDay1 == 30 && nDay2 == 31 )\n"
1621 " if ( nMonth1 == 2 && nDay1 == "
1622 "( IsLeapYear( nYear1 ) ? 29 : 28 ) )\n"
1625 " if ( nMonth2 == 2 && nDay2 == "
1626 "( IsLeapYear( nYear2 ) ? 29 : 28 ) )\n"
1632 " nDayDiff = ( nYear2 - nYear1 ) * 360 + "
1633 "( nMonth2 - nMonth1 ) * 30 + ( nDay2 - nDay1 );\n"
1638 " nDayDiff = nDate2 - nDate1;\n"
1641 " if ( nDay1 == 31 )\n"
1645 " if ( nDay2 == 31 )\n"
1649 " nDayDiff = ( nYear2 - nYear1 ) * 360 + "
1650 "( nMonth2 - nMonth1 ) * 30 + ( nDay2 - nDay1 );\n"
1653 " double nDaysInYear;\n"
1654 " switch( nMode )\n"
1659 " nDaysInYear = 360;\n"
1663 " bool isYearDifferent = ( nYear1 != nYear2 );\n"
1664 " if ( isYearDifferent &&\n"
1665 " ( ( nYear2 != nYear1 + 1 ) ||\n"
1666 " ( nMonth1 < nMonth2 ) ||\n"
1667 " ( nMonth1 == nMonth2 && nDay1 < nDay2 ) ) )\n"
1669 " int nDayCount = 0;\n"
1670 " for ( int i = nYear1; i <= nYear2; i++ )\n"
1671 " nDayCount += ( IsLeapYear( i ) ? 366 : 365 );\n"
1672 " nDaysInYear = ( double ) nDayCount / "
1673 "( double ) ( nYear2 - nYear1 + 1 );\n"
1677 " if ( isYearDifferent && IsLeapYear( nYear1 ) )\n"
1679 " nDaysInYear = 366;\n"
1683 " if ( ( IsLeapYear( nYear1 ) && nMonth1 <= 2 "
1684 "&& nDay1 <= 29 ) ||\n"
1685 " ( IsLeapYear( nYear2 ) && ( nMonth2 > 3 || "
1686 "( nMonth2 == 2 && nDay1 == 29 ) ) ) )\n"
1688 " nDaysInYear = 366;\n"
1692 " nDaysInYear = 365;\n"
1693 " for ( int i = nYear1; i <= nYear2; i++ )\n"
1695 " if ( IsLeapYear( i ) )\n"
1697 " nDaysInYear = 366;\n"
1707 " nDaysInYear = 365;\n"
1710 " return (double)( nDayDiff ) / (nDaysInYear);\n"
1714 "void DaysToDate_new( int nDays, int *rDay, int* rMonth, int* rYear );\n";
1717 "void DaysToDate_new( int nDays, int *rDay, int* rMonth, int* rYear )\n"
1724 " nTempDays = nDays;\n"
1725 " *rYear = (int)((nTempDays / 365) - i);\n"
1726 " nTempDays -= ((int) *rYear -1) * 365;\n"
1727 " nTempDays -= ((*rYear -1) / 4) - ((*rYear -1) / 100) + ((*rYear -1)"
1730 " if ( nTempDays < 1 )\n"
1737 " if ( nTempDays > 365 )\n"
1739 " if ( (nTempDays != 366) || !IsLeapYear( *rYear ) )\n"
1747 " while ( bCalc );\n"
1748 " if(nTempDays != 0){\n"
1749 " for (*rMonth = 1; (int)nTempDays > DaysInMonth( *rMonth, *rYear );"
1752 " nTempDays -= DaysInMonth( *rMonth, *rYear ); \n"
1754 " *rDay = (int)nTempDays;\n"
1759 "void DaysToDate( int nDays, int *rDay, int* rMonth, int* rYear );\n";
1762 "void DaysToDate( int nDays, int *rDay, int* rMonth, int* rYear )\n"
1769 " nTempDays = nDays;\n"
1770 " *rYear = (int)((nTempDays / 365) - i);\n"
1771 " nTempDays -= ((int) *rYear -1) * 365;\n"
1772 " nTempDays -= ((*rYear -1) / 4) - ((*rYear -1) / 100) + ((*rYear -1)"
1775 " if ( nTempDays < 1 )\n"
1782 " if ( nTempDays > 365 )\n"
1784 " if ( (nTempDays != 366) || !IsLeapYear( *rYear ) )\n"
1792 " while ( bCalc );\n"
1793 " barrier(CLK_LOCAL_MEM_FENCE);\n"
1794 " if(nTempDays != 0){\n"
1795 " for (*rMonth = 1; (int)nTempDays > DaysInMonth( *rMonth, *rYear );"
1798 " nTempDays -= DaysInMonth( *rMonth, *rYear ); \n"
1800 " *rDay = (int)nTempDays;\n"
1805 "double GetYearDiff_new( int nNullDate, int nStartDate, int nEndDate,"
1809 "double GetYearDiff_new( int nNullDate, int nStartDate, int nEndDate,"
1812 " int nDays1stYear;\n"
1813 " int nTotalDays = GetDiffDate_new( nNullDate, nStartDate, nEndDate,"
1816 " return (double)(nTotalDays)* pow((double)nDays1stYear,-1);\n"
1820 "int GetDiffDate_new( int nNullDate, int nStartDate, int nEndDate, int nMode,"
1821 " int* pOptDaysIn1stYear );\n";
1824 "int GetDiffDate_new( int nNullDate, int nStartDate, int nEndDate, int nMode,"
1825 " int* pOptDaysIn1stYear )\n"
1827 " bool bNeg = nStartDate > nEndDate;\n"
1830 " int n = nEndDate;\n"
1831 " nEndDate = nStartDate;\n"
1832 " nStartDate = n;\n"
1835 " switch( nMode )\n"
1840 " int nD1, nM1, nY1, nD2, nM2, nY2;\n"
1841 " nStartDate += nNullDate;\n"
1842 " nEndDate += nNullDate;\n"
1843 " DaysToDate_new( nStartDate, &nD1, &nM1, &nY1 );\n"
1844 " DaysToDate_new( nEndDate, &nD2, &nM2, &nY2 );\n"
1845 " bool bLeap = IsLeapYear( nY1 );\n"
1846 " int nDays, nMonths;\n"
1847 " nMonths = nM2 - nM1;\n"
1848 " nDays = nD2 - nD1;\n"
1849 " nMonths += ( nY2 - nY1 ) * 12;\n"
1850 " nRet = nMonths * 30 + nDays;\n"
1851 " if( nMode == 0 && nM1 == 2 && nM2 != 2 && nY1 == nY2 )\n"
1852 " nRet -= bLeap? 1 : 2;\n"
1853 " if( pOptDaysIn1stYear )\n"
1854 " *pOptDaysIn1stYear = 360;\n"
1858 " if( pOptDaysIn1stYear )\n"
1860 " int nD, nM, nY;\n"
1861 " DaysToDate_new( nStartDate + nNullDate, &nD, &nM, &nY );\n"
1862 " *pOptDaysIn1stYear = IsLeapYear( nY )? 366 : 365;\n"
1864 " nRet = nEndDate - nStartDate;\n"
1867 " nRet = nEndDate - nStartDate;\n"
1868 " if( pOptDaysIn1stYear )\n"
1869 " *pOptDaysIn1stYear = 360;\n"
1872 " nRet = nEndDate - nStartDate;\n"
1873 " if( pOptDaysIn1stYear )\n"
1874 " *pOptDaysIn1stYear = 365;\n"
1877 " return bNeg? -nRet : nRet;\n"
std::string ScInterVDBDecl
std::string DaysToDate_new
std::string GetOddlpriceDecl
std::string GetNullDate_new
std::string DateToDaysDecl
std::string GetYearFrac_newDecl
std::string coupdaysnc_new
std::string GetYearDiffDecl
std::string GetDiffDate360_
std::string GetDaysInYear
std::string GetDiffDate360
std::string DaysInMonth_new
std::string IsLeapYearDecl
std::string getPrice_new_Decl
std::string GetDiffDate360_Decl
std::string GetDiffDate360Decl
std::string GetYieldmatDecl
std::string GetYearDiff_newDecl
std::string SCdEpsilonDecl
std::string lcl_GetCouppcd
std::string lcl_Getcoupdaybs
std::string lcl_GetCoupncdDecl
std::string coupdaysnc_newDecl
std::string DaysToDate_LocalBarrierDecl
std::string GetDaysInYearsDecl
std::string lcl_GetcoupdaybsDecl
std::string lcl_Getcoupnum_newDecl
std::string DaysInMonth_newDecl
std::string DateToDays_newDecl
std::string lcl_GetcoupnumDecl
std::string lcl_GetCouppcdDecl
std::string coupdaybs_new
std::string lcl_Getcoupnum
std::string lcl_Getcoupdaybs_newDecl
std::string GetDaysInYearDecl
std::string GetDaysInYears
std::string addMonthsDecl
std::string lcl_GetCoupncd
std::string DaysToDateDecl
std::string coupdaybs_newDecl
std::string getDaysInMonthRange
std::string DaysToDate_LocalBarrier
std::string lcl_Getcoupnum_new
std::string GetOddlyieldDecl
std::string VDBImplementDecl
std::string GetDuration_newDecl
std::string GetDuration_new
std::string lcl_Getcoupdays_newDecl
std::string coupnum_newDecl
std::string coupdaysncDecl
std::string DaysInMonthDecl
std::string GetPMT_newDecl
std::string coupdays_newDecl
std::string lcl_Getcoupdays_new
std::string GetFV_newDecl
std::string getDaysInMonthRangeDecl
std::string getPrice_Decl
std::string GetNullDateDecl
std::string checklessthanDecl
std::string lcl_Getcoupdaybs_new
std::string getYield_Decl
std::string lcl_GetcoupdaysDecl
std::string coupdaybsDecl
std::string checklessthan
std::string lcl_Getcoupdays
std::string GetDiffDateDecl
std::string GetYearFrac_new
std::string DateToDays_new
std::string GetYearFracDecl
std::string GetDiffDate_new
std::string GetDurationDecl
std::string getDaysInYearRangeDecl
std::string GetDiffDate_newDecl
std::string GetNullDate_newDecl
std::string getDaysInYearRange
std::string DaysToDate_newDecl
std::string GetYearDiff_new