This is Anuity.m in view mode; [Download] [Up]
#import "Anuity.h" #include <math.h> @implementation Anuity double doubleFactorOf(double c, double factor) { int va = (c / factor); return ((double) va) * factor; } - (void)awakeFromNib { [capitalSlide setAltIncrementValue:1000.0]; [tauxSld setAltIncrementValue:0.05]; [dureeSld setAltIncrementValue:0.5]; [pmntSld setAltIncrementValue: 5.0]; } - (void)chmtMatrixDidChange:(id)sender { } - (void)periodeDidChange:(id)sender { [self updateValue]; } - (void)slideDidChange:(id)sender { } - (void)txtDidChange:(id)sender { } - (void)updatedCapitalTxt:(id)sender { double c = [sender doubleValue]; c = doubleFactorOf(c, 100.0); [capitalSlide setDoubleValue:c]; [self updateValue]; } - (void)updatedTauxTxt:(id)sender { [tauxSld takeDoubleValueFrom:sender]; [self updateValue]; } - (void)updatedDureeTxt:(id)sender { [dureeSld takeStringValueFrom:sender]; [self updateValue]; } - (void)updatedPmntTxt:(id)sender { [pmntSld takeStringValueFrom:sender]; [self updateValue]; } - (void)updatedCapitalSld:(id)sender { double c = [sender doubleValue]; c = doubleFactorOf(c, 100.0); [capitalTxt setDoubleValue:c]; [self updateValue]; } - (void)updatedTauxSld:(id)sender { double c = [sender doubleValue]; c = doubleFactorOf(c, 0.05); [tauxTxt setDoubleValue:c]; [self updateValue]; } - (void)updatedDureeSld:(id)sender { double c = [sender doubleValue]; c = doubleFactorOf(c, 0.5); [dureeTxt setDoubleValue:c]; [self updateValue]; } - (void)updatedPmntSld:(id)sender { double c = [sender doubleValue]; c = doubleFactorOf(c, 5.0); [pmntTxt setDoubleValue:c]; [self updateValue]; } double tryTaux(double capital, double duree, double pmnt, double m, double tx); double tryTaux(double capital, double n, double pmnt, double m, double i) { double tx = i / m; double term = pmnt * (1.0-pow(1.0+tx,n*m*-1.0))/tx; double fi = capital - term; double fii = 0.0, ni = 0.0; if(fabs(fi) < 10.0) return i; fii = pmnt * ((i*n*pow(1.0+tx, (-n*m)-1.0)) - (1.0 - pow(1.0+tx, -m*n))) / (i*tx); ni = fi / fii ; return tryTaux(capital, n, pmnt, m, i + ni); } - (void)updateValue { double capital = [capitalTxt doubleValue]; double duree = [dureeTxt doubleValue]; double pmnt = [pmntTxt doubleValue]; double taux = [self tauxNormalise]; double m = [self m]; double tx = taux/m; int tag = [[chmtMatrix selectedCell] tag]; switch(tag) { case 0 : // ajustement du capital { capital = pmnt * (1.0-pow(1.0+tx,duree*m*-1.0))/tx; [capitalTxt setFloatValue:capital]; [capitalSlide setFloatValue:capital]; break; } case 1 : // ajustement du taux { double t = 0.0; taux = tryTaux(capital, duree, pmnt, m, taux); t = 100.0 * [self tauxSemestrielFromNormalise:taux]; [tauxTxt setFloatValue:t]; [tauxSld setFloatValue:t]; break; } case 2 : // ajustement de la duree { double base = 1.0+tx; double valu = -(( ( capital * tx ) / pmnt ) - 1.0); double lg1 = log(valu); double lg2 = log(base); duree = -lg1 / (lg2*m); [dureeTxt setDoubleValue:duree]; [dureeSld setDoubleValue:duree]; break; } case 3 : // ajustement du paiement { pmnt = capital/( (1-pow(1+tx,duree*[self m]*-1))/tx); [pmntTxt setFloatValue:pmnt]; [pmntSld setFloatValue:pmnt]; break; } default: break; } [futurValueTxt setDoubleValue:duree*m*pmnt]; } - (double)m { int tag = [[periodeSld selectedCell] tag]; switch(tag) { case 0: return 12.0; break; case 1: return 26.2; break; case 2: return 52.4; break; default: return 12.0; } return 12.0; } - (double)tauxSemestrielFromNormalise:(double) i { double m = [self m]; return 2.0*(pow(1.0+(i/m), m/2.0)-1.0); } - (double)tauxNormalise { double m = [self m]; return m*(pow(1.0+([tauxTxt doubleValue]/200.0),2.0/m)-1.0); } /* - (void)report:(id)sender { NSMutableString *report = @"Report of god !\r"; [report appendWithFormat:@"Capital : %f $\r Taux : %f\%\r duree : "]; return; } */ @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.