Skip to content

Commit f06449f

Browse files
committed
changed infinity behavior
1 parent 5a0784c commit f06449f

File tree

2 files changed

+96
-24
lines changed

2 files changed

+96
-24
lines changed

complex.js

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,10 @@
181181
}
182182

183183
if (tokens[i + 1] !== ' ' && !isNaN(tokens[i + 1])) {
184-
P['im'] += parseFloat((minus % 2 ? '-' : '') + tokens[i + 1]);
184+
P['im']+= parseFloat((minus % 2 ? '-' : '') + tokens[i + 1]);
185185
i++;
186186
} else {
187-
P['im'] += parseFloat((minus % 2 ? '-' : '') + '1');
187+
P['im']+= parseFloat((minus % 2 ? '-' : '') + '1');
188188
}
189189
plus = minus = 0;
190190

@@ -195,10 +195,10 @@
195195
}
196196

197197
if (tokens[i + 1] === 'i' || tokens[i + 1] === 'I') {
198-
P['im'] += parseFloat((minus % 2 ? '-' : '') + c);
198+
P['im']+= parseFloat((minus % 2 ? '-' : '') + c);
199199
i++;
200200
} else {
201-
P['re'] += parseFloat((minus % 2 ? '-' : '') + c);
201+
P['re']+= parseFloat((minus % 2 ? '-' : '') + c);
202202
}
203203
plus = minus = 0;
204204
}
@@ -330,7 +330,7 @@
330330
(a !== 0) ? (a / 0) : 0,
331331
(b !== 0) ? (b / 0) : 0);
332332
} else {
333-
// Divisor is rational
333+
// Divisor is real
334334
return new Complex(a / c, b / c);
335335
}
336336
}
@@ -376,7 +376,7 @@
376376

377377
if (P['im'] === 0) {
378378

379-
if (b === 0 && a >= 0) {
379+
if (b === 0 && !(0 > a && isFinite(P['re']))) {
380380

381381
return new Complex(Math.pow(a, P['re']), 0);
382382

@@ -416,6 +416,12 @@
416416

417417
a = Math.exp(P['re'] * loh - P['im'] * arg);
418418
b = P['im'] * loh + P['re'] * arg;
419+
420+
if (!isFinite(b)) {
421+
// Return complex infinity
422+
return Complex['Infinity'];
423+
}
424+
419425
return new Complex(
420426
a * Math.cos(b),
421427
a * Math.sin(b));
@@ -1053,9 +1059,13 @@
10531059

10541060
var d = a * a + b * b;
10551061

1062+
if (d === 0) {
1063+
return Complex['Infinity'];
1064+
}
1065+
10561066
return new Complex(
1057-
a !== 0 ? a / d : 0,
1058-
b !== 0 ? -b / d : 0);
1067+
a / d,
1068+
-b / d);
10591069
},
10601070

10611071
/**
@@ -1152,30 +1162,37 @@
11521162

11531163
var a = this['re'];
11541164
var b = this['im'];
1165+
var e = Complex['EPSILON'];
11551166
var ret = '';
11561167

11571168
if (isNaN(a) || isNaN(b)) {
11581169
return 'NaN';
11591170
}
11601171

1161-
if (a !== 0) {
1162-
ret += a;
1172+
if (Math.abs(a) < e) {
1173+
/* void */
1174+
} else if (isFinite(a)) {
1175+
ret+= a;
1176+
} else if (a < 0) {
1177+
ret+= '-∞';
1178+
} else {
1179+
ret += '∞';
11631180
}
11641181

1165-
if (b !== 0) {
1182+
if (-e > b || b > e) { // means b !== 0
11661183

1167-
if (a !== 0) {
1168-
ret += b < 0 ? ' - ' : ' + ';
1184+
if (-e > a || a > e) {// means a !== 0
1185+
ret+= b < 0 ? ' - ' : ' + ';
11691186
} else if (b < 0) {
1170-
ret += '-';
1187+
ret+= '-';
11711188
}
11721189

11731190
b = Math.abs(b);
11741191

11751192
if (1 !== b) {
1176-
ret += b;
1193+
ret+= isFinite(b) ? b : '∞';
11771194
}
1178-
ret += 'i';
1195+
ret+= 'i';
11791196
}
11801197

11811198
if (!ret)
@@ -1222,6 +1239,7 @@
12221239
Complex['I'] = new Complex(0, 1);
12231240
Complex['PI'] = new Complex(Math.PI, 0);
12241241
Complex['E'] = new Complex(Math.E, 0);
1242+
Complex['Infinity'] = new Complex(Infinity, Infinity);
12251243
Complex['EPSILON'] = 1e-16;
12261244

12271245
if (typeof define === 'function' && define['amd']) {

tests/complex.test.js

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ var tests = [{
3131
expect: "2.3"
3232
}, {
3333
set: {re: -Infinity, im: 0},
34-
expect: "-Infinity"
34+
expect: "-"
3535
}, {
3636
set: Complex.I,
3737
fn: "mul",
@@ -89,7 +89,12 @@ var tests = [{
8989
set: "4 + 2i",
9090
fn: "div",
9191
param: "0",
92-
expect: "Infinity + Infinityi"
92+
expect: "∞ + ∞i"
93+
}, {
94+
set: "4",
95+
fn: "div",
96+
param: "0",
97+
expect: "∞"
9398
}, {
9499
set: "4 + 2i",
95100
fn: "div",
@@ -152,12 +157,12 @@ var tests = [{
152157
}, {
153158
set: 0,
154159
fn: "log",
155-
expect: "-Infinity"
160+
expect: "-"
156161
}, {
157162
set: Infinity,
158163
fn: "mul",
159164
param: 3,
160-
expect: "Infinity"
165+
expect: ""
161166
}, {
162167
set: "-1",
163168
fn: "log",
@@ -215,6 +220,55 @@ var tests = [{
215220
fn: "pow",
216221
param: "1",
217222
expect: "i"
223+
}, {
224+
set: 0,
225+
fn: "inverse",
226+
expect: "∞ + ∞i"
227+
}, {
228+
set: -0.5,
229+
fn: "pow",
230+
param: Infinity,
231+
expect: "0"
232+
}, {
233+
set: -2,
234+
fn: "pow",
235+
param: Infinity,
236+
expect: "∞ + ∞i"
237+
}, {
238+
set: -0.6,
239+
fn: "pow",
240+
param: 7,
241+
expect: "-0.027993599999999987"
242+
}, {
243+
set: 0,
244+
fn: "pow",
245+
param: Infinity,
246+
expect: "0"
247+
}, {
248+
set: "8",
249+
fn: "pow",
250+
param: Infinity,
251+
expect: "∞"
252+
}, {
253+
set: "8+9i",
254+
fn: "pow",
255+
param: Infinity,
256+
expect: "∞ + ∞i"
257+
}, {
258+
set: 0.5,
259+
fn: "pow",
260+
param: Infinity,
261+
expect: "0"
262+
}, {
263+
set: "-0.5 - 0.5i",
264+
fn: "pow",
265+
param: Infinity,
266+
expect: "∞ + ∞i"
267+
}, {
268+
set: "-0.5 + 7i",
269+
fn: "pow",
270+
param: Infinity,
271+
expect: "∞ + ∞i"
218272
}, {
219273
set: "i",
220274
fn: "pow",
@@ -318,7 +372,7 @@ var tests = [{
318372
set: -Infinity,
319373
fn: "div",
320374
param: 3,
321-
expect: "-Infinity"
375+
expect: "-"
322376
}, {
323377
set: {re: 1, im: 2},
324378
fn: "add",
@@ -467,7 +521,7 @@ var tests = [{
467521
}, {
468522
set: "0",
469523
fn: "inverse",
470-
expect: "0"
524+
expect: "∞ + ∞i"
471525
}, {
472526
set: Complex['EPSILON'],
473527
fn: "equals",
@@ -558,7 +612,7 @@ var tests = [{
558612
set: Complex(1, 1).sub(0, 1).mul({abs: 1, arg: Math.PI / 2}), // Rotate around another point
559613
fn: "add",
560614
param: "i",
561-
expect: "6.123233995736766e-17 + 2i"
615+
expect: "2i"
562616
}, {
563617
set: "- + 7",
564618
expect: "-7"
@@ -641,7 +695,7 @@ describe("Complex Details", function() {
641695
assert.equal(one.mul(one).toString(), Complex(0, 2).toString());
642696
assert.equal(one.div(2).toString(), "0.5 + 0.5i");
643697
assert.equal(one.div(one).toString(), "1");
644-
assert.equal(one.div(0).toString(), "Infinity + Infinityi");
698+
assert.equal(one.div(0).toString(), " + ∞i");
645699
assert.equal(one.exp().toString(), "1.4686939399158851 + 2.2873552871788423i");
646700
assert.equal(one.log().toString(), "0.34657359027997264 + 0.7853981633974483i");
647701
assert.equal(one.pow(one).toString(), "0.2739572538301211 + 0.5837007587586147i");

0 commit comments

Comments
 (0)