WEBVTT
1
00:00:01.169 --> 00:00:04.790
How'd you like to listen to. NET Rocks with no ads? Easy.
2
00:00:05.370 --> 00:00:08.769
Become a patron. For just $ 5 a month, you get
3
00:00:08.890 --> 00:00:11.720
access to a private RSS feed where all the shows
4
00:00:11.800 --> 00:00:14.900
have no ads. $ 20 a month will get you that
5
00:00:15.119 --> 00:00:18.839
and a special. NET Rocks patron mug. Sign up now
6
00:00:18.899 --> 00:00:37.149
at patreon.dotnetrocks.com. Hey, and welcome back to. NET Rocks. I'm
7
00:00:37.200 --> 00:00:37.909
Carl Franklin.
8
00:00:38.030 --> 00:00:38.789
And I'm Richard Cavill.
9
00:00:38.969 --> 00:00:44.969
We have been doing this stupid show for 2019 episodes.
10
00:00:45.990 --> 00:00:46.990
What is wrong with us?
11
00:00:47.409 --> 00:00:50.600
I don't know. It's a pattern. And this, you know, yeah,
12
00:00:51.060 --> 00:00:53.640
can kind of anticipate that sometime next week might be
13
00:00:53.659 --> 00:00:54.039
another one.
14
00:00:54.340 --> 00:00:55.859
You know, I say it's a stupid show. I got
15
00:00:55.880 --> 00:00:59.979
to admit, it got a lot smarter after episode 100.
16
00:00:59.979 --> 00:01:02.429
I don't know why, but I don't know why. It
17
00:01:02.469 --> 00:01:06.799
was really stupid. Before that. There was a period. I
18
00:01:07.840 --> 00:01:10.930
remember drawing you out a Venn diagram. It's like, here
19
00:01:10.969 --> 00:01:14.709
are the people who like a technical interview. Here are
20
00:01:14.769 --> 00:01:18.269
the people that like music and comedy and so forth.
21
00:01:18.349 --> 00:01:21.829
And the intersection between the two is small. Very small.
22
00:01:22.090 --> 00:01:22.310
Yeah.
23
00:01:22.450 --> 00:01:25.260
Okay. So, we made two shows.
24
00:01:25.859 --> 00:01:30.579
Yeah. Spoiler alert. We are fixing to make a new Mondays.
25
00:01:31.049 --> 00:01:32.930
Oh, don't give it away, man. I just did. It
26
00:01:32.950 --> 00:01:34.730
might even be out by the time this thing publishes,
27
00:01:34.750 --> 00:01:35.290
but who knows?
28
00:01:35.709 --> 00:01:35.989
Maybe.
29
00:01:36.170 --> 00:01:36.409
Maybe.
30
00:01:36.430 --> 00:01:36.709
Who knows?
31
00:01:37.269 --> 00:01:37.489
All right.
32
00:01:37.530 --> 00:01:42.459
Well, this being episode 2019, we are going to talk
33
00:01:42.519 --> 00:01:45.280
about what happened in 2019. And by the way, Jeffrey
34
00:01:45.319 --> 00:01:46.920
Sachs is with us, and I just want to invite
35
00:01:46.959 --> 00:01:49.420
Jeffrey to jump in if he wants to during this whole.
36
00:01:49.519 --> 00:01:52.680
He probably remembers 2019, too. It was not that long ago.
37
00:01:52.879 --> 00:01:54.040
It was not that long ago.
38
00:01:54.359 --> 00:01:56.540
All right. So, believe it or not, I have a
39
00:01:56.620 --> 00:01:59.849
few good news stories. For 2019. Nice.
40
00:01:59.870 --> 00:02:02.780
You get tired of being the harbinger of doom, do you?
41
00:02:03.540 --> 00:02:04.359
Not your style at all.
42
00:02:04.719 --> 00:02:08.039
I am. Yeah, especially last 2018 was just dark.
43
00:02:08.419 --> 00:02:09.939
Just depressing. Yeah.
44
00:02:10.259 --> 00:02:12.740
So I will have some bad news too, but for
45
00:02:12.780 --> 00:02:16.710
some good. The world's first malaria vaccine began rolling out
46
00:02:16.750 --> 00:02:17.610
in Africa.
47
00:02:17.710 --> 00:02:18.069
Exciting.
48
00:02:18.169 --> 00:02:22.810
Malawi, Ghana, and Kenya began vaccinating children with RTSS, the
49
00:02:22.870 --> 00:02:25.780
first malaria vaccine used in a large-scale public health program.
50
00:02:26.729 --> 00:02:30.000
Our friend Bill Gates and Melinda Gates were behind that.
51
00:02:30.680 --> 00:02:32.840
I don't know if they're actually our friends, but we've
52
00:02:33.180 --> 00:02:40.210
seen them. Yeah, I met them. About 360,000 children per
53
00:02:40.250 --> 00:02:43.090
year were expected to receive it during the pilot. So cool.
54
00:02:44.090 --> 00:02:49.180
Ethiopia and Eritrea's peace efforts received the Nobel Peace Prize.
55
00:02:50.060 --> 00:02:50.539
Very good.
56
00:02:50.740 --> 00:02:53.599
Those two have been at loggerheads since their formations.
57
00:02:53.759 --> 00:02:54.020
Yeah.
58
00:02:54.319 --> 00:02:58.500
And see, it is possible. Nearly 100 captive whales and
59
00:02:58.659 --> 00:03:02.740
orcas were returned to the wild. Russian authorities gradually released
60
00:03:02.819 --> 00:03:06.699
animals from the notorious whale jail in the country's far east.
61
00:03:07.240 --> 00:03:10.400
By November, the remaining 50 beluga whales had been freed,
62
00:03:10.460 --> 00:03:11.939
completing the operation.
63
00:03:12.139 --> 00:03:12.319
Wow.
64
00:03:12.490 --> 00:03:18.849
Reminds me of Star Trek IV. Algeria and Argentina eliminated malaria.
65
00:03:19.189 --> 00:03:21.889
Eliminated. How cool is that? Well, there's a bunch of
66
00:03:21.909 --> 00:03:23.449
ways to tackle that, right? Like you can do it
67
00:03:23.490 --> 00:03:29.000
by just controlling mosquitoes. Yeah. But also, you know, handing
68
00:03:29.069 --> 00:03:31.300
out nets. Like there's all kinds of tools to try.
69
00:03:31.539 --> 00:03:36.020
And it all works together. Ethiopia launched a massive tree
70
00:03:36.080 --> 00:03:42.110
planting campaign. Millions participated in the country's green legacy reforestation effort.
71
00:03:42.770 --> 00:03:46.909
The Ethiopian government reported that roughly 350 million seedlings were
72
00:03:46.949 --> 00:03:49.469
planted in a single day in July, part of a
73
00:03:49.509 --> 00:03:54.389
campaign aimed at planting billions of trees. The exact single-day
74
00:03:54.509 --> 00:04:01.069
figure wasn't independently verified, but the enormous public participation was real. So,
75
00:04:01.569 --> 00:04:04.669
now let's get to the depressing stuff. Well, maybe not depressing,
76
00:04:04.710 --> 00:04:08.159
but you know. Donald Trump is impeached. For the first time.
77
00:04:08.379 --> 00:04:13.909
Depressing? It's up to you, I think. Hong Kong pro-democracy protests.
78
00:04:14.009 --> 00:04:14.669
Do not go well.
79
00:04:14.729 --> 00:04:16.089
What began as... What's that?
80
00:04:16.189 --> 00:04:17.009
Do not go well.
81
00:04:17.269 --> 00:04:17.470
No.
82
00:04:17.970 --> 00:04:21.149
What began as opposition to an extradition bill grew into
83
00:04:21.209 --> 00:04:26.889
enormous demonstrations demanding democratic reforms and resistance to Beijing's increasing influence.
84
00:04:27.600 --> 00:04:30.899
The protests continued for months and frequently resulted in violent
85
00:04:30.920 --> 00:04:38.139
clashes with the police. Brexit crisis and Boris Johnson's rise. Richard,
86
00:04:38.379 --> 00:04:41.519
do you remember we were sitting in a restaurant somewhere
87
00:04:41.540 --> 00:04:44.660
and you looked over and you said, hey, that's Boris Johnson.
88
00:04:45.199 --> 00:04:46.819
Do you remember that? It was in London.
89
00:04:46.839 --> 00:04:47.240
Yeah.
90
00:04:47.360 --> 00:04:48.480
We were at NDC London.
91
00:04:48.639 --> 00:04:48.800
Yeah.
92
00:04:48.860 --> 00:04:51.139
And you're like, that's Boris Johnson. And I said.
93
00:04:51.220 --> 00:04:51.959
He was in the restaurant.
94
00:04:52.370 --> 00:04:56.310
I said, who? Because I didn't know.
95
00:04:56.470 --> 00:04:58.629
He was the mayor of London one point. And he
96
00:04:58.649 --> 00:05:00.550
was kind of funny when he was the mayor of London.
97
00:05:00.569 --> 00:05:01.589
The quirky guy.
98
00:05:01.949 --> 00:05:05.009
I think this was before his further rise, so I
99
00:05:05.069 --> 00:05:06.069
really didn't know who he was.
100
00:05:06.110 --> 00:05:07.970
Before he was prime minister. Yeah.
101
00:05:08.069 --> 00:05:11.209
But, you know, we did see him. Theresa May repeatedly
102
00:05:11.250 --> 00:05:13.920
failed to get her Brexit agreement through parliament and resigned.
103
00:05:14.420 --> 00:05:17.720
Boris Johnson became prime minister, negotiated a revised deal, and
104
00:05:17.759 --> 00:05:24.779
then won a huge conservative majority in December. Christchurch mosque massacres.
105
00:05:25.100 --> 00:05:29.819
Bad news. This was in New Zealand, your home country.
106
00:05:30.250 --> 00:05:34.509
A white supremacist attacked two mosques in Christchurch on March 15th,
107
00:05:34.550 --> 00:05:38.009
killing 51 people. But the massacre led New Zealand to
108
00:05:38.100 --> 00:05:39.480
rapidly tighten its gun laws.
109
00:05:39.629 --> 00:05:40.319
Yeah, what a concept.
110
00:05:40.740 --> 00:05:44.860
Notre Dame Cathedral set ablaze on April 15th.
111
00:05:44.879 --> 00:05:45.639
It was an accident.
112
00:05:45.740 --> 00:05:46.019
Yeah.
113
00:05:46.579 --> 00:05:50.420
On April 15th, the world watched as the 850-year-old cathedral
114
00:05:50.480 --> 00:05:54.319
in Paris burned. Its famous spire collapsed and much of
115
00:05:54.339 --> 00:05:57.180
the medieval roof was destroyed, although firefighters managed to save
116
00:05:57.199 --> 00:06:00.990
the main structure. And many important artworks and relics. And
117
00:06:01.410 --> 00:06:03.769
they rebuilt it. It is rebuilt now, yeah. I haven't
118
00:06:03.810 --> 00:06:05.660
seen the new one, but it's on my list. And
119
00:06:05.680 --> 00:06:08.699
you can still see the guy in the tower.
120
00:06:08.480 --> 00:06:09.360
Going, yes, master.
121
00:06:09.379 --> 00:06:19.709
Boeing 737 MAX crashes in worldwide grounding. Was this the
122
00:06:19.750 --> 00:06:21.050
beginning of the end for Boeing?
123
00:06:21.750 --> 00:06:24.110
Oh, no. This was towards the end of the end.
124
00:06:24.129 --> 00:06:25.389
Towards the end of the end.
125
00:06:26.230 --> 00:06:27.670
When you get to the point of actually building an
126
00:06:27.790 --> 00:06:30.509
unsafe aircraft and ignoring the fact that your engineers are
127
00:06:30.529 --> 00:06:32.670
telling you it's unsafe until it starts killing people, you
128
00:06:32.750 --> 00:06:33.649
are very lost.
129
00:06:34.000 --> 00:06:38.420
Yeah. Just a couple more. The U.S.-China trade war escalates.
130
00:06:39.959 --> 00:06:46.420
ISIS leader Abu Bakr al-Baghdadi killed. Mass shootings in El
131
00:06:46.480 --> 00:06:53.100
Paso and Dayton, Ohio. And worldwide protest movements erupt. Beyond
132
00:06:53.139 --> 00:07:02.509
Hong Kong, 2019 saw enormous anti-government demonstrations in Chile, Lebanon, Iraq, Algeria, Sudan, Iran, Bolivia,
133
00:07:02.649 --> 00:07:07.329
and Haiti, among others. So, people not happy.
134
00:07:07.790 --> 00:07:08.730
No. Yeah.
135
00:07:09.069 --> 00:07:11.269
You done? Yeah, I guess I'm done. Let me give
136
00:07:11.290 --> 00:07:12.350
you one more grim one.
137
00:07:12.370 --> 00:07:12.870
Okay.
138
00:07:13.069 --> 00:07:16.139
Right at the end of December 2019, authorities in Wuhan,
139
00:07:16.160 --> 00:07:18.120
China report an unusual pneumonia.
140
00:07:18.670 --> 00:07:19.350
Interesting.
141
00:07:19.379 --> 00:07:19.649
Yeah.
142
00:07:19.790 --> 00:07:21.129
That might have been COVID.
143
00:07:21.350 --> 00:07:21.990
Might have been. Yeah.
144
00:07:22.790 --> 00:07:24.910
Yeah, because that's when.
145
00:07:24.829 --> 00:07:27.389
It really started. All right. You ready for some space stuff? Sure.
146
00:07:27.410 --> 00:07:30.290
Go for it. January, the New Horizons spacecraft, the one
147
00:07:30.310 --> 00:07:34.529
that had gone to Pluto, still going, had its next
148
00:07:34.680 --> 00:07:37.720
close flyby to a Kuiper belt object. Today, we call
149
00:07:37.740 --> 00:07:40.699
that Kuiper belt object Arrokoth, although at the time they
150
00:07:40.720 --> 00:07:44.180
called it Ultima Thule. So that's over a billion kilometers
151
00:07:44.279 --> 00:07:47.579
beyond Pluto. That's how fast that thing was moving. And
152
00:07:47.600 --> 00:07:51.100
was basically a primordial solar system object. It was literally
153
00:07:51.220 --> 00:07:54.339
two blobs of rock and ice stuck together in a
154
00:07:54.399 --> 00:07:58.160
very low gravitational space. But, you know, just an extraordinary
155
00:07:58.240 --> 00:08:01.620
scene back to the early history of the solar system
156
00:08:01.689 --> 00:08:05.329
that way. That's 2019. It's been seven more years. New
157
00:08:05.350 --> 00:08:09.329
Horizons is still whizzing out at very high speed. Also
158
00:08:09.389 --> 00:08:13.209
in January, China's Chang'e 4 lander lands on the far
159
00:08:13.269 --> 00:08:15.930
side of the moon. First time ever in the Von
160
00:08:15.970 --> 00:08:21.810
Karman crater. It has the U-2-2 rover on board. I
161
00:08:21.860 --> 00:08:25.000
think that means little rabbit. It will start its exploration
162
00:08:25.040 --> 00:08:29.000
in the previous year. China had also put up their
163
00:08:29.060 --> 00:08:31.310
relay satellite so they could communicate to the far side
164
00:08:31.350 --> 00:08:34.690
of the moon. In February, back on Mars, the Opportunity
165
00:08:34.750 --> 00:08:38.250
Rover finally ends its mission after 15 years. Designed about
166
00:08:38.269 --> 00:08:40.169
the size of a golf cart, designed for operations for
167
00:08:40.169 --> 00:08:45.460
90 days, ran for 15 years. Now, in 2019, it
168
00:08:45.500 --> 00:08:50.320
was when it declared its mission over. Its last communication
169
00:08:50.340 --> 00:08:54.710
was actually in 2018. There had been a major dust
170
00:08:54.750 --> 00:08:57.889
storm in 2018 on Mars. And that was always the
171
00:08:57.929 --> 00:09:00.590
challenge with these rovers is that there was spirit and opportunities.
172
00:09:00.629 --> 00:09:03.330
They are all solar-based, and so the dust covers up
173
00:09:03.350 --> 00:09:07.389
the solar panels. But the atmosphere of Mars occasionally would
174
00:09:07.450 --> 00:09:11.830
create dust levels that would clean those solar panels off. Classically,
175
00:09:13.549 --> 00:09:16.360
at that time, Opportunity had its own Twitter account, and
176
00:09:16.440 --> 00:09:18.820
so the operators would take the telemetry data and turn
177
00:09:18.840 --> 00:09:22.600
it into text as a tweet from Opportunity. And so
178
00:09:22.620 --> 00:09:26.240
Opportunity's last tweet was, my battery's getting low, and it's
179
00:09:26.279 --> 00:09:28.940
getting dark. Of course, the reality for a device like
180
00:09:28.960 --> 00:09:31.279
that is that if it doesn't have enough power to
181
00:09:31.360 --> 00:09:34.679
keep its electronics warm overnight, those will freeze and it
182
00:09:34.720 --> 00:09:36.960
will not power back up. And that's what happened to Opportunity. Bummer.
183
00:09:37.139 --> 00:09:40.840
In March, the Crew Dragon by SpaceX does its first
184
00:09:41.159 --> 00:09:44.210
flight to the International Space Station. It's completely autonomous. It
185
00:09:44.269 --> 00:09:46.470
actually does its own docking. There's nobody on board. It
186
00:09:46.570 --> 00:09:51.389
works perfectly. It then leaves the station and de-orbits and
187
00:09:51.549 --> 00:09:54.830
lands in the ocean and is recovered successfully. All good news.
188
00:09:55.830 --> 00:09:58.700
Here's the bad news. The following month, that same capsule
189
00:09:58.879 --> 00:10:01.779
is now having an abortion. system test. This was an
190
00:10:01.840 --> 00:10:04.580
unmanned test tethered to the ground firing the Super Dracos
191
00:10:05.100 --> 00:10:08.710
and something goes terribly wrong and the vehicle is destroyed
192
00:10:08.730 --> 00:10:11.870
in the explosion. Bummer. There was a leak in the
193
00:10:11.909 --> 00:10:16.690
helium system for the Super Dracos that created a mass detonation.
194
00:10:17.070 --> 00:10:19.210
NASA actually considered it lucky. It was a huge gift.
195
00:10:19.960 --> 00:10:22.639
You know, you'd hate to have that occur during an
196
00:10:22.759 --> 00:10:27.419
actual flight. It'll delay things for the rest of the year.
197
00:10:27.460 --> 00:10:29.559
They won't flag it until 2020, although that will actually
198
00:10:29.580 --> 00:10:33.470
deliver crew successfully. They'll do a new abort system, use tests,
199
00:10:33.590 --> 00:10:37.769
including an in-flight unmanned abort. Also in April, also on Mars,
200
00:10:37.809 --> 00:10:40.549
the InSight lander will get its first telemetry by measuring
201
00:10:40.590 --> 00:10:43.149
a Mars quake to start mapping the interior of Mars.
202
00:10:43.850 --> 00:10:47.620
So opportunity's done, but the InSight lander's doing its thing. Uh,
203
00:10:47.820 --> 00:10:52.299
also in April, the Israeli nonprofit, uh, company space IL
204
00:10:52.340 --> 00:10:56.279
launched the bear sheet lander, the first commercial privately funded
205
00:10:56.340 --> 00:10:59.440
lunar lander ever flies on a Falcon nine. It originally
206
00:10:59.460 --> 00:11:02.200
been part of the lunar X prize, which started back
207
00:11:02.240 --> 00:11:05.360
in 2017 and 2007 and had ended in 2018. So
208
00:11:05.440 --> 00:11:08.759
it was actually over. It did make it to the moon,
209
00:11:08.820 --> 00:11:12.000
but failed on its landing, which is not that unusual, uh,
210
00:11:12.039 --> 00:11:13.830
because it's really hard to land on the moon. In fact,
211
00:11:14.330 --> 00:11:16.570
Later in the year, in July, India will launch their
212
00:11:16.610 --> 00:11:19.230
Chandran-2 to the moon, and their orbital will work perfectly,
213
00:11:19.250 --> 00:11:22.529
but their Vikram lander will crash on its descent towards
214
00:11:22.570 --> 00:11:28.049
the South Pole. Also in April, the Event Horizon Telescope
215
00:11:28.100 --> 00:11:31.159
publishes the first image of a black hole in the
216
00:11:31.200 --> 00:11:34.960
center of the galaxy, Messier 87. I remember. So this
217
00:11:35.039 --> 00:11:38.500
is using a technology called very long baseline infrometry, where
218
00:11:38.519 --> 00:11:41.879
they actually harness data from a dozen or so different
219
00:11:41.919 --> 00:11:44.750
radio telescopes around the world. to create a sort of
220
00:11:44.909 --> 00:11:48.269
super radio telescope. And then they composite the image into
221
00:11:48.309 --> 00:11:51.080
what they, um, black hole look like. And it turned
222
00:11:51.129 --> 00:11:55.139
out looked exactly like the one in interstellar, uh, which, which, uh,
223
00:11:55.220 --> 00:11:57.179
there's a good reason for that. Uh, Christopher Nolan hired
224
00:11:57.200 --> 00:12:01.009
a Caltech physicist named Kim Thorne, who actually figured out
225
00:12:01.070 --> 00:12:04.259
what it should look like. And, uh, the, EHT actually
226
00:12:04.299 --> 00:12:04.960
validated that.
227
00:12:05.120 --> 00:12:07.659
And it was very low resolution, if I remember correctly.
228
00:12:07.759 --> 00:12:10.259
Of course. But, you know, you're literally talking billions of
229
00:12:10.299 --> 00:12:12.620
light years away. So it's a miracle it works at all.
230
00:12:12.639 --> 00:12:15.840
But it's just, you know, we're getting new superpowers. In May,
231
00:12:15.860 --> 00:12:19.519
SpaceX launches the very first batch of Starlink satellites, an
232
00:12:19.559 --> 00:12:23.850
array of 60. Yeah. In August, SpaceX does their first
233
00:12:23.879 --> 00:12:27.230
flight of Starhopper. This was a funny little looking can
234
00:12:27.269 --> 00:12:29.590
of a thing with some legs on it. Flew just
235
00:12:29.629 --> 00:12:33.309
a short distance and landed again. It's the beginning of Starship,
236
00:12:33.500 --> 00:12:35.580
but the really important thing is this is their new
237
00:12:35.679 --> 00:12:39.679
Raptor engine, a methane liquid oxygen engine. And it's also
238
00:12:39.759 --> 00:12:41.620
full flow combustion. So that was the first time that
239
00:12:41.659 --> 00:12:44.840
a full flow combustion stage combustion engine had ever flown.
240
00:12:45.399 --> 00:12:47.889
And it'll get bigger for that. And one little piece
241
00:12:47.929 --> 00:12:51.809
of additional Boeing news alongside killing people in their dangerous 737,
242
00:12:51.809 --> 00:12:53.049
which admittedly is now fixed.
243
00:12:53.090 --> 00:12:53.309
Yeah.
244
00:12:53.370 --> 00:12:56.149
And I have flown on it. Uh, Boeing flies their
245
00:12:56.190 --> 00:12:58.570
Starliner to the International Space Station for the first time,
246
00:12:58.649 --> 00:13:00.190
except for that part where it never got to the
247
00:13:00.230 --> 00:13:00.889
space station.
248
00:13:01.190 --> 00:13:01.529
Right.
249
00:13:02.529 --> 00:13:07.529
Software bugs in the system cause the vehicle to decide
250
00:13:07.580 --> 00:13:09.799
that it's actually farther along the mission than it actually is.
251
00:13:09.860 --> 00:13:13.580
And it tries to correct its orientation inappropriately. And before
252
00:13:13.600 --> 00:13:16.039
they can send commands to get it to stop doing that,
253
00:13:16.500 --> 00:13:18.980
it burns up so much of its maneuvering fuel. That
254
00:13:19.000 --> 00:13:20.620
it's unable to make it to the space station. They
255
00:13:20.679 --> 00:13:23.419
do get control of it, fix the problem with the
256
00:13:23.460 --> 00:13:27.710
software and successfully de-orbit and recover the vehicle. But that
257
00:13:27.730 --> 00:13:29.490
will only be the beginning of a whole series of
258
00:13:29.529 --> 00:13:32.909
terrible problems for Starliner that are not resolved to this day.
259
00:13:33.190 --> 00:13:36.230
Hey, when you mentioned Starlink, you were using Starlink, right?
260
00:13:36.450 --> 00:13:37.070
Are you using it now?
261
00:13:37.269 --> 00:13:40.149
I wasn't at that point. It would be later. I
262
00:13:40.169 --> 00:13:42.090
would apply for the beta and get into the beta
263
00:13:42.269 --> 00:13:43.909
in a couple of years after that. But are you
264
00:13:43.929 --> 00:13:47.549
using it right now? I'm not right now, no. It's
265
00:13:47.600 --> 00:13:49.940
my backup. I have fiber now to this house in
266
00:13:49.960 --> 00:13:52.820
the middle of nowhere, which is ridiculous. It is ridiculous.
267
00:13:52.840 --> 00:13:56.360
Starlink is the backup. Okay, onto the computing side of things.
268
00:13:56.460 --> 00:13:59.940
A whole bunch of stories around OpenAI. So February of
269
00:13:59.940 --> 00:14:04.940
2019 is the release of GPT-2. And remember that the
270
00:14:05.340 --> 00:14:07.649
mantra of OpenAI had been to do AI out in
271
00:14:07.659 --> 00:14:09.690
the open, do it also open source, right? That's why
272
00:14:09.710 --> 00:14:13.350
it's called OpenAI. But they come to the conclusion that
273
00:14:13.370 --> 00:14:16.809
their largest model in GPT-2, which was a 1.5 billion
274
00:14:16.830 --> 00:14:20.379
parameter model, oh, how quaint, is too powerful and that
275
00:14:20.389 --> 00:14:22.460
it shouldn't be shared publicly. So they only release a
276
00:14:22.480 --> 00:14:26.000
very tiny version of it just to show its potential.
277
00:14:26.740 --> 00:14:29.019
And they are starting to reconsider what the company's all about.
278
00:14:29.720 --> 00:14:31.860
Part of this is they're working on a paper, which
279
00:14:31.879 --> 00:14:36.700
they'll publish in 2020, about... the scale necessary to build
280
00:14:36.720 --> 00:14:39.639
these language models and that being a not-for-profit is just
281
00:14:39.679 --> 00:14:42.240
not feasible. It's not the way they're going to be successful.
282
00:14:42.620 --> 00:14:44.909
And so in March, they'll restructure OpenAI to become what
283
00:14:44.929 --> 00:14:48.009
they call a capped profit company, which is funny because
284
00:14:48.029 --> 00:14:49.830
this is all around the time that likely they're talking
285
00:14:49.870 --> 00:14:54.269
to Microsoft because in June, Kevin Scott wrote an email
286
00:14:54.370 --> 00:14:58.679
to Bill Gates and Satya Nadella called Thoughts on OpenAI.
287
00:14:59.490 --> 00:15:02.190
where he talked about the fact that OpenAI and DeepMind
288
00:15:02.210 --> 00:15:05.110
and Google Brain were well ahead of Microsoft and that
289
00:15:05.129 --> 00:15:09.490
there was an opportunity to invest in OpenAI and put
290
00:15:09.509 --> 00:15:12.169
them over onto Azure and maybe have a relationship. That,
291
00:15:12.210 --> 00:15:15.379
of course, will happen in July. Sam Altman and Nadella
292
00:15:15.389 --> 00:15:19.659
will be on stage together. We'll announce an exclusive cloud partnership.
293
00:15:19.720 --> 00:15:20.539
I do remember that.
294
00:15:20.879 --> 00:15:23.740
And finally, in December, Microsoft will put a billion dollars
295
00:15:23.879 --> 00:15:27.460
into OpenAI, although how much of that they'll spend buying Azure,
296
00:15:27.480 --> 00:15:31.340
we don't really know. Related to one of your stories
297
00:15:31.399 --> 00:15:35.500
early on about China, in March, the UK publishes a
298
00:15:35.539 --> 00:15:41.429
report about Huawei, concerns about Chinese security with kill switches
299
00:15:41.549 --> 00:15:45.049
on 5G networking and things like that. The UK has
300
00:15:45.110 --> 00:15:48.169
a group that's actually getting into the software that drives
301
00:15:48.230 --> 00:15:50.629
all of those things, but they consider the software such
302
00:15:50.720 --> 00:15:54.179
poor quality that they can't even verify its reliability or
303
00:15:54.220 --> 00:15:59.559
security and consider it unsafe to use. That will result
304
00:15:59.580 --> 00:16:03.360
in May, the Trump administration will literally say, you can't
305
00:16:03.580 --> 00:16:06.899
use Huawei stuff, full stop. And it'll spread around all
306
00:16:06.919 --> 00:16:09.419
of the Western world, really. That's around the time the
307
00:16:09.460 --> 00:16:12.370
first 5G networks actually get deployed in the US, in April.
308
00:16:13.429 --> 00:16:16.450
Also in April, but on April 2nd, not April 1st,
309
00:16:16.669 --> 00:16:21.129
probably deliberately, Google shuts down, Google +. Can't do that
310
00:16:21.169 --> 00:16:26.700
on April 2nd, it's not funny. Okay, September, Visual Studio 2019.
311
00:16:26.700 --> 00:16:31.470
with Framework 4.8, but also. NET Core 3.0, which is
312
00:16:31.529 --> 00:16:34.379
really the point where you kind of hit parity, so
313
00:16:34.409 --> 00:16:37.519
the features, In the old framework that we wanted in
314
00:16:37.539 --> 00:16:39.799
the open source cloud platform version, they were all there
315
00:16:39.879 --> 00:16:41.240
now and more or less complete.
316
00:16:41.299 --> 00:16:42.519
That's where I started using it.
317
00:16:42.559 --> 00:16:42.840
Yeah.
318
00:16:42.919 --> 00:16:44.320
I started using it at three.
319
00:16:44.519 --> 00:16:46.080
Yeah, and it was the point where it's like, hey,
320
00:16:46.100 --> 00:16:48.000
this is the end of the road. There won't be a.
321
00:16:48.139 --> 00:16:50.299
NET Core 4. There won't be two versions of. NET
322
00:16:50.350 --> 00:16:52.470
after this. There'll just be five, although you know the
323
00:16:52.509 --> 00:16:56.210
old framework, 4.8 will never go anymore. And in December,
324
00:16:56.230 --> 00:16:59.669
they'll put out 3.1, fixing some of the problems. Two
325
00:16:59.690 --> 00:17:04.309
more stories. October. Google's Sycamore processor. So the first real
326
00:17:04.430 --> 00:17:09.130
public demonstration of what we would call quantum supremacy. This
327
00:17:09.190 --> 00:17:12.170
was one of those chandeliers soaked in liquid helium style
328
00:17:12.230 --> 00:17:15.259
quantum computers, very fragile. It had 54 qubits, only 53
329
00:17:15.259 --> 00:17:19.220
of them were functioning, did a 200 second run doing
330
00:17:19.259 --> 00:17:23.180
a random number sampling task. Google argued that this would
331
00:17:23.200 --> 00:17:25.819
take 10,000 years with a traditional computer and they finished
332
00:17:25.839 --> 00:17:28.619
it in 200 seconds. IBM, of course, challenged the numbers
333
00:17:28.640 --> 00:17:32.519
and then demonstrated various strata on quantum strategies to get
334
00:17:32.619 --> 00:17:34.650
pretty good results. I think they're fastest when they got
335
00:17:34.670 --> 00:17:39.130
it down to a couple of days, but whatever. But
336
00:17:39.170 --> 00:17:42.980
it is in a wave of advancement in quantum computing.
337
00:17:43.559 --> 00:17:45.160
And last but not least, because I do think it
338
00:17:45.220 --> 00:17:47.799
impacts a lot of the conversations we're having today in
339
00:17:47.819 --> 00:17:54.180
December at Amazon's reInvent conference, They talk about Graviton2, which
340
00:17:54.240 --> 00:17:59.519
was custom ARM processors for workloads in EC2. They're promising
341
00:17:59.519 --> 00:18:02.519
40% better price performance. Up until this point, for the
342
00:18:02.579 --> 00:18:07.809
most part, the cloud had been regular machines bought with
343
00:18:07.890 --> 00:18:10.109
Intel and AMD chips and so forth, bought by the
344
00:18:10.150 --> 00:18:12.910
big vendors, already pre-racked and so forth. But now the
345
00:18:12.930 --> 00:18:15.910
cloud companies, Amazon being one, but also Microsoft and Google
346
00:18:15.930 --> 00:18:18.319
as well. Google was already going into their TensorFlows and
347
00:18:18.339 --> 00:18:21.450
things like that. Are starting to build their own hardware
348
00:18:21.470 --> 00:18:24.349
to optimize for cloud workloads. And that's going to change
349
00:18:24.410 --> 00:18:25.329
things going forward.
350
00:18:25.529 --> 00:18:25.769
Yeah.
351
00:18:25.970 --> 00:18:26.950
Those are my stories, friend.
352
00:18:27.170 --> 00:18:30.740
All right. Well, that brings us to better know a framework.
353
00:18:30.859 --> 00:18:31.339
Awesome.
354
00:18:31.660 --> 00:18:33.819
Or something. Better Know Something, maybe we should call it.
355
00:18:33.829 --> 00:18:35.009
Better Know Something.
356
00:18:35.250 --> 00:18:36.369
That would have been a great title.
357
00:18:37.410 --> 00:18:47.670
All right, man, what do you got? Okay, so for
358
00:18:47.710 --> 00:18:51.170
those of you paying attention to my other shows, Rocky
359
00:18:51.210 --> 00:18:55.180
Latka and I started with him as co-host on Code
360
00:18:55.200 --> 00:18:59.180
It With AI, which is presented by DevExpress.
361
00:19:00.180 --> 00:19:00.480
And we....
362
00:19:02.000 --> 00:19:08.200
Just put Quen 3.8 local to the test. Quen 3.8
363
00:19:08.200 --> 00:19:11.380
is a model, and I ran it on Ollama. And
364
00:19:11.779 --> 00:19:15.200
we had done on episodes 29 and 30 with Jeff Fritz,
365
00:19:15.740 --> 00:19:20.420
we had done comparisons between local models running in this
366
00:19:20.519 --> 00:19:22.480
hardware that I have, right, in Ollama.
367
00:19:22.859 --> 00:19:23.019
Yeah.
368
00:19:23.240 --> 00:19:26.869
And Quen 3.6 was the winner by far. So I
369
00:19:27.029 --> 00:19:28.890
was thinking Quen 3.8, going to be great.
370
00:19:30.269 --> 00:19:30.509
Yeah.
371
00:19:31.269 --> 00:19:43.950
Not so much. Interesting. because Alama allocates context depending on
372
00:19:43.970 --> 00:19:46.420
the amount of VRAM you have.
373
00:19:47.599 --> 00:19:52.420
So I got 30, 35 or 32, 32 K based
374
00:19:52.480 --> 00:19:54.259
on the amount of VRAM that I had, but I
375
00:19:54.279 --> 00:19:57.440
don't think it was enough because it was, it was
376
00:19:57.849 --> 00:20:01.029
doing the confusing things that the other models had done earlier,
377
00:20:01.329 --> 00:20:04.569
which is telling you that it, you know, couldn't reach
378
00:20:04.589 --> 00:20:10.569
the API, giving you some weird nil error, and stopping.
379
00:20:11.809 --> 00:20:18.650
So Rocky tells me about llama.cpp. And llama.cpp is an
380
00:20:18.710 --> 00:20:24.250
alternative to Ollama that it allows you to host models.
381
00:20:24.329 --> 00:20:27.430
But the cool thing about it is that it can
382
00:20:27.490 --> 00:20:30.890
take the compute heavy stuff and run that in VRAM.
383
00:20:31.309 --> 00:20:33.470
And then it can use your system RAM for the
384
00:20:33.509 --> 00:20:35.299
rest of it. Now, I don't know if it swaps
385
00:20:35.359 --> 00:20:39.309
things in and out, system RAM, VRAM, or it just
386
00:20:39.549 --> 00:20:42.990
runs some things that don't require such a heavy load
387
00:20:45.490 --> 00:20:49.609
in system RAM, but that's it. So then there are
388
00:20:49.650 --> 00:20:52.630
only certain models that can run, but there's a QEN
389
00:20:52.670 --> 00:20:57.279
model that runs that's bigger that I'm going to try
390
00:20:57.359 --> 00:21:01.160
for next week's Code with AI. Well, I say next week.
391
00:21:01.859 --> 00:21:07.940
We're recording this on August 21st. or 20th, rather.
392
00:21:09.500 --> 00:21:09.900
I'm sorry.
393
00:21:10.299 --> 00:21:15.640
We're recording this on August 21st, and it won't come
394
00:21:15.680 --> 00:21:20.700
out until September 10th. So the episode would be 43,
395
00:21:20.700 --> 00:21:25.309
and that would be on last week, September 2nd. So
396
00:21:25.329 --> 00:21:27.140
if you want to see what that does, I'm going
397
00:21:27.160 --> 00:21:29.130
to have a live demo of it. I'm going to
398
00:21:29.150 --> 00:21:32.269
try it, but llama.cpp. Know it, learn it, love it.
399
00:21:32.829 --> 00:21:34.029
Who's talking to us today, Richard?
400
00:21:34.490 --> 00:21:37.130
I had to go back. We're doing mathematics today, so
401
00:21:37.150 --> 00:21:38.509
I had to go back to a mathematics show. So,
402
00:21:38.529 --> 00:21:41.990
I went way back. 1252, which is from 2016. Our
403
00:21:42.019 --> 00:21:48.940
friend Seth Juarez talking about his library, NUML. Because secretly,
404
00:21:49.460 --> 00:21:51.599
Seth Juarez, as charming and entertaining as he was on
405
00:21:51.640 --> 00:21:54.609
Channel 9, actually a maths guy. Got a real, you know,
406
00:21:54.619 --> 00:21:58.009
got a master's degree. Super smart, you know. Great at
407
00:21:58.049 --> 00:21:59.470
explaining the whole.
408
00:21:59.769 --> 00:22:00.029
Oh, yeah.
409
00:22:00.650 --> 00:22:02.650
LLM wave too. We've done some cool shows with it.
410
00:22:03.269 --> 00:22:06.789
So this is a comment from, uh, Kirian O'Neill, who
411
00:22:06.829 --> 00:22:09.839
says another scheduling library along the lines of courts.net. We
412
00:22:09.880 --> 00:22:12.460
were talking about that library as well. Worth mentioning is
413
00:22:12.599 --> 00:22:15.839
hang fire. The advantage I've gained from using hang fires
414
00:22:15.880 --> 00:22:18.180
that it runs in process. It doesn't require a separate
415
00:22:18.240 --> 00:22:20.849
window service. And depending on your use cases can be
416
00:22:20.869 --> 00:22:23.279
a big advantage. And it's one less thing to think
417
00:22:23.339 --> 00:22:26.740
about when deploying because, yeah, pushing out stuff to count
418
00:22:26.779 --> 00:22:29.880
on Windows services and stuff is ugly if you're going
419
00:22:29.900 --> 00:22:31.720
to try and make things work properly for you. But,
420
00:22:32.299 --> 00:22:33.960
you know, this was a whole conversation we had with
421
00:22:34.009 --> 00:22:36.930
Seth about how you do these long compute workloads when
422
00:22:36.950 --> 00:22:39.150
you're working out things like machine learning models and so
423
00:22:39.190 --> 00:22:41.009
forth where they may run for a couple of days.
424
00:22:41.630 --> 00:22:43.450
And you don't want to just tie up the whole machine.
425
00:22:43.490 --> 00:22:45.630
You want to run them in the background. Yep. So, Kirian,
426
00:22:45.650 --> 00:22:47.450
thank you so much for your comment. And a copy
427
00:22:47.470 --> 00:22:48.849
of Music to Code By is on its way to you.
428
00:22:48.869 --> 00:22:50.430
And if you'd like a copy of Music to Code By,
429
00:22:50.450 --> 00:22:53.460
write a comment on the website at. netrocks. com or on
430
00:22:53.480 --> 00:22:55.019
the Facebooks. We publish every show there. And if you
431
00:22:55.059 --> 00:22:56.640
comment there and I read it in the show, we'll
432
00:22:56.660 --> 00:22:57.740
send you a copy of Music to Code By.
433
00:22:57.819 --> 00:22:59.180
And if you want to just go get Music to
434
00:22:59.200 --> 00:23:01.099
Code By, it's at musictocodeby.net.
435
00:23:01.980 --> 00:23:02.180
All right.
436
00:23:02.200 --> 00:23:05.160
We've taken up so much time with this intro stuff.
437
00:23:05.299 --> 00:23:07.099
I think we ought to take our break now so
438
00:23:07.119 --> 00:23:11.039
we can have an uninterrupted talk with Jeffrey Sachs. So
439
00:23:11.059 --> 00:23:17.369
we'll be right back after these very important messages. And
440
00:23:17.390 --> 00:23:21.109
we're back. It's. NET Rocks. I'm Carl Franklin. That's Richard Campbell.
441
00:23:21.349 --> 00:23:21.529
Hey.
442
00:23:21.789 --> 00:23:24.309
And also here with us is Jeffrey Sachs.
443
00:23:24.430 --> 00:23:25.250
Hi. Hi.
444
00:23:26.109 --> 00:23:30.279
Jeffrey Sachs is the founder and sole developer of Numerics.net,
445
00:23:30.910 --> 00:23:32.980
a set of numerical computing libraries for.
446
00:23:33.200 --> 00:23:33.359
NET.
447
00:23:34.059 --> 00:23:37.480
He has been building the library since 2005 when the
448
00:23:37.539 --> 00:23:42.130
first version was released for. NET 1.1. Over the years, Numerics.net
449
00:23:42.170 --> 00:23:46.089
has been used for applications ranging from calculating radiation doses
450
00:23:46.170 --> 00:23:50.650
for cancer treatment and developing truck braking systems to building
451
00:23:50.690 --> 00:23:56.319
support software for atomic force microscopes. Jeffrey's work on numerical
452
00:23:56.380 --> 00:23:57.680
software predates.
453
00:23:57.960 --> 00:23:58.160
NET.
454
00:23:58.380 --> 00:23:59.619
Jeffrey, welcome.
455
00:23:59.859 --> 00:24:00.119
Hi.
456
00:24:00.779 --> 00:24:02.180
Thank you. Thanks for having me.
457
00:24:02.460 --> 00:24:03.029
You're welcome.
458
00:24:03.490 --> 00:24:07.200
Sorry about the long intro. If you're okay with it,
459
00:24:07.230 --> 00:24:10.299
we can go a little longer today. But my first
460
00:24:10.359 --> 00:24:14.259
question is, what is numerical computing?
461
00:24:14.740 --> 00:24:19.799
I would say numerical computing is the task of computing
462
00:24:19.859 --> 00:24:28.150
values to a requested accuracy with limited precision. And do
463
00:24:28.190 --> 00:24:30.210
that as fast as possible.
464
00:24:30.450 --> 00:24:36.410
So it's basically just math equations in code. Essentially, like
465
00:24:36.549 --> 00:24:39.150
a MATLAB kind of thing?
466
00:24:39.730 --> 00:24:41.069
Yeah, that's what it comes down to.
467
00:24:41.309 --> 00:24:42.730
Simulink, yeah.
468
00:24:43.019 --> 00:24:45.799
So this is outside the spectrum of what the built-in
469
00:24:45.839 --> 00:24:50.220
mathematical functions in. NET could do?
470
00:24:50.579 --> 00:24:52.119
Yes, way beyond, actually.
471
00:24:52.319 --> 00:24:52.579
Right.
472
00:24:54.319 --> 00:24:59.589
Vectors, matrices, probability, and statistics, all kinds of fun stuff.
473
00:24:59.769 --> 00:25:01.789
So it's all based on the fundamental stuff that's in
474
00:25:01.809 --> 00:25:04.970
the framework, but then you do these... abstractions on top
475
00:25:05.029 --> 00:25:07.269
of it that give you the higher level.
476
00:25:08.289 --> 00:25:08.710
That's right.
477
00:25:09.230 --> 00:25:10.710
Yeah, constructs.
478
00:25:10.990 --> 00:25:13.119
All right, let's dust off our math chop, see if
479
00:25:13.130 --> 00:25:19.019
we remember any of this stuff from school. Holy man. So,
480
00:25:19.140 --> 00:25:20.940
I mean, just in your comment alone, you were talking
481
00:25:20.960 --> 00:25:23.680
about things like radiation doses. So, can you talk a
482
00:25:23.680 --> 00:25:26.240
bit about what kind of math we need there? It's
483
00:25:26.279 --> 00:25:27.500
a great thing to figure out.
484
00:25:27.799 --> 00:25:28.680
Actually, I'm not sure.
485
00:25:28.700 --> 00:25:29.140
I just.
486
00:25:29.740 --> 00:25:31.339
hear a lot of stories from customers.
487
00:25:31.759 --> 00:25:32.119
Oh, right.
488
00:25:32.460 --> 00:25:35.019
Um, these are just your customers doing cool things with
489
00:25:35.059 --> 00:25:35.720
your software.
490
00:25:35.880 --> 00:25:36.140
Yeah.
491
00:25:36.619 --> 00:25:38.440
So that's the most fun part of what I do.
492
00:25:38.519 --> 00:25:39.940
I hear all sorts of things.
493
00:25:40.160 --> 00:25:40.789
Yeah. Yeah.
494
00:25:41.210 --> 00:25:43.190
Um, and you heard some variety of what I hear.
495
00:25:43.430 --> 00:25:45.509
Your background is in mathematics then?
496
00:25:45.650 --> 00:25:47.950
Yes, it is. I actually, right.
497
00:25:48.190 --> 00:25:49.990
So you just take him what you've learned and said like,
498
00:25:50.089 --> 00:25:52.190
how could I do these things in.net?
499
00:25:52.539 --> 00:25:55.799
Yes. I, I've been doing this pretty much my whole
500
00:25:55.839 --> 00:25:58.259
life ever since I got my hands on the computer.
501
00:25:59.000 --> 00:26:02.329
Um, And then went to university.
502
00:26:02.890 --> 00:26:06.339
Got a degree in computing science, so specializing in the
503
00:26:06.440 --> 00:26:07.220
numerical stuff.
504
00:26:07.660 --> 00:26:08.259
And then.
505
00:26:09.900 --> 00:26:13.339
After some time of building things privately, like just for
506
00:26:13.380 --> 00:26:16.940
my own enjoyment, I thought, well, why not turn this
507
00:26:17.019 --> 00:26:21.079
into my job and do it professionally?
508
00:26:21.460 --> 00:26:21.680
Wow.
509
00:26:21.880 --> 00:26:23.890
And that's how Numerics.net got started.
510
00:26:24.269 --> 00:26:24.450
Wow.
511
00:26:24.940 --> 00:26:28.119
You remind me of a product that when I was
512
00:26:28.160 --> 00:26:31.460
at Crescent Software, we sold. I didn't write it. I
513
00:26:32.130 --> 00:26:35.730
just did tech support. But it was called QuickPack Scientific.
514
00:26:36.829 --> 00:26:41.859
And so in that was a bunch of assembly language things,
515
00:26:42.460 --> 00:26:45.759
calls that you could call from basic, from QuickBasic, Basic
516
00:26:45.759 --> 00:26:50.269
7 PDS, and even Visual Basic, that did all these
517
00:26:50.329 --> 00:26:53.349
kinds of things. And I wondered even back then, why
518
00:26:53.369 --> 00:26:55.150
do you need all this if you have the fundamentals?
519
00:26:55.210 --> 00:26:56.970
And it's kind of like, you know, why do you
520
00:26:56.990 --> 00:26:59.210
need a database if you can open and read and
521
00:26:59.230 --> 00:26:59.789
write files?
522
00:27:00.890 --> 00:27:01.650
Right?
523
00:27:02.069 --> 00:27:06.650
These are layers of abstraction that help you as a non-programmer,
524
00:27:06.950 --> 00:27:11.359
maybe a scientist that dabbles in programming, do stuff easily.
525
00:27:11.539 --> 00:27:15.099
Well, it's not just about the layers of abstraction, although
526
00:27:15.119 --> 00:27:20.289
that can be useful as well. It's also about the
527
00:27:20.329 --> 00:27:25.029
limitations that you have doing math on a computer and
528
00:27:25.109 --> 00:27:26.309
still doing things correctly.
529
00:27:26.579 --> 00:27:26.859
Yeah.
530
00:27:26.950 --> 00:27:29.319
So I said, it's, we got to dig into this
531
00:27:29.380 --> 00:27:32.420
because I think it's fascinating. What, what are the, we never,
532
00:27:32.700 --> 00:27:34.319
most of the time we don't bump into these limitations.
533
00:27:34.519 --> 00:27:35.759
What are the limitations?
534
00:27:35.980 --> 00:27:41.380
Well, the primary limitation is you can't represent every number
535
00:27:41.640 --> 00:27:43.710
from real life in a computer system.
536
00:27:43.910 --> 00:27:44.190
Right.
537
00:27:44.369 --> 00:27:44.569
Right.
538
00:27:44.710 --> 00:27:48.549
So we have, integers, and then we have what we
539
00:27:48.589 --> 00:27:52.970
call real numbers. But those are really the double precision
540
00:27:53.049 --> 00:27:55.529
floating point numbers is the official name. Right.
541
00:27:55.670 --> 00:27:58.190
Yeah. And I think the floating point's a better term
542
00:27:58.230 --> 00:28:01.009
just because it lets you know. This is only so accurate.
543
00:28:01.269 --> 00:28:01.710
Yeah.
544
00:28:01.950 --> 00:28:08.670
So the limitation is these numbers have a very specific format.
545
00:28:09.210 --> 00:28:11.309
They're an integer times a power of two.
546
00:28:12.009 --> 00:28:12.230
Right.
547
00:28:12.529 --> 00:28:15.109
And you only have a certain range to work with.
548
00:28:15.720 --> 00:28:21.039
So every calculation you do, you basically are able to
549
00:28:21.180 --> 00:28:23.039
use only those numbers. Yeah.
550
00:28:23.160 --> 00:28:24.319
And that's what makes it hard.
551
00:28:24.759 --> 00:28:28.119
Right, right. So it's the precision. And you mentioned precision
552
00:28:28.420 --> 00:28:32.710
in your definition of numerical computing, that you may want
553
00:28:33.089 --> 00:28:38.450
less or more. But I get more. Why less? Yeah.
554
00:28:38.849 --> 00:28:44.630
Well, in modern-day computing, there's a lot of talk about–
555
00:28:45.359 --> 00:28:49.440
reducing the number of bits required for LLMs and so
556
00:28:49.500 --> 00:28:53.920
forth to do their calculations and still have good results.
557
00:28:54.539 --> 00:28:58.769
So they'll sample down from the original 16 or 32
558
00:28:58.769 --> 00:29:02.309
bits down to sometimes as little as four or two
559
00:29:02.349 --> 00:29:02.910
bits even.
560
00:29:03.170 --> 00:29:03.450
Wow.
561
00:29:03.670 --> 00:29:07.670
So that's why you would use less. In general, for calculations,
562
00:29:09.569 --> 00:29:13.750
you would use the standard four or eight number formats.
563
00:29:15.150 --> 00:29:19.269
because the resources aren't as tight and the computation isn't
564
00:29:19.849 --> 00:29:20.470
as intense.
565
00:29:20.809 --> 00:29:21.450
Yeah, okay.
566
00:29:21.630 --> 00:29:24.890
And so the point being, when you use a higher precision,
567
00:29:24.950 --> 00:29:27.109
it's just going to take longer for no value.
568
00:29:27.390 --> 00:29:30.609
Yeah, but if you use too little precision, things can
569
00:29:30.650 --> 00:29:31.890
go terribly long as well.
570
00:29:32.130 --> 00:29:32.369
Right.
571
00:29:32.769 --> 00:29:37.549
There's a famous example of um an arianne 5 rocket
572
00:29:38.839 --> 00:29:40.220
in 96 i think.
573
00:29:40.099 --> 00:29:42.700
It was oh yeah they lost the first one they.
574
00:29:42.579 --> 00:29:49.140
Lost the first one because some value was um stored
575
00:29:49.339 --> 00:29:54.240
as a 16-bit value for the arianne 4 rocket the
576
00:29:54.279 --> 00:29:58.339
predecessor right and they converted down from 64 bits to
577
00:29:58.339 --> 00:30:02.809
16 got an overflow which sent their navigation system into
578
00:30:02.930 --> 00:30:06.259
some kind of error state and they had to terminate
579
00:30:06.539 --> 00:30:07.680
the launch.
580
00:30:07.900 --> 00:30:10.140
Yeah, that's a very expensive boo-boo.
581
00:30:10.220 --> 00:30:10.799
Yes, it is.
582
00:30:10.880 --> 00:30:12.640
Like billion-dollar boo-boo.
583
00:30:12.940 --> 00:30:16.440
Yeah, and so one of the things that makes it
584
00:30:16.480 --> 00:30:21.220
hard is because you have that limited set of numbers,
585
00:30:23.329 --> 00:30:26.349
whenever you do a calculation, you have to start by
586
00:30:27.190 --> 00:30:32.059
approximating the number you get from real life by a
587
00:30:32.200 --> 00:30:34.220
number that's in your set that you can work with.
588
00:30:35.480 --> 00:30:38.460
So you have to round it off and that already
589
00:30:38.720 --> 00:30:42.900
right off, right out of the gate, you start with
590
00:30:42.940 --> 00:30:48.740
an error and then errors propagate. Like every calculation you do,
591
00:30:48.759 --> 00:30:52.900
when you add two numbers, the sum of those two
592
00:30:52.940 --> 00:30:58.400
numbers may not be a floating point number again. So
593
00:30:58.420 --> 00:31:03.700
then you get additional errors And sometimes it can explode and, well,
594
00:31:04.019 --> 00:31:04.900
lead to explosions.
595
00:31:05.460 --> 00:31:07.259
Right. Quite literally.
596
00:31:07.500 --> 00:31:07.720
Yeah.
597
00:31:07.880 --> 00:31:10.559
Yeah, I remember watching that, actually. And it's like suddenly
598
00:31:10.599 --> 00:31:12.779
the engines were trying to move the rocket in ways
599
00:31:12.859 --> 00:31:14.400
it really wouldn't want to move. And then it just
600
00:31:14.420 --> 00:31:15.599
sort of broke into pieces.
601
00:31:15.839 --> 00:31:16.599
Yeah, that's right.
602
00:31:16.819 --> 00:31:19.440
I had a friend. He's gone now. But he was
603
00:31:19.740 --> 00:31:27.049
a professor of mathematics. And he called himself a philosopher
604
00:31:27.480 --> 00:31:27.940
of math.
605
00:31:28.710 --> 00:31:28.950
And I.
606
00:31:30.650 --> 00:31:34.470
Was, I guess, into things that were so abstract that
607
00:31:35.150 --> 00:31:38.150
nobody could understand them, and you had to just think
608
00:31:38.210 --> 00:31:42.089
about them completely differently. One of those things that I
609
00:31:42.150 --> 00:31:47.670
think of in that vein are imaginary numbers. What the
610
00:31:47.710 --> 00:31:49.490
hell is an imaginary number?
611
00:31:50.779 --> 00:31:51.039
Right?
612
00:31:51.410 --> 00:31:55.880
Well, an imaginary number is a trick, basically, to.
613
00:31:57.759 --> 00:32:01.859
Make... the math work. So there's.
614
00:32:03.880 --> 00:32:07.880
A theory where when you compute the roots of a
615
00:32:07.920 --> 00:32:17.839
quadratic equation, you always have two roots. If you have
616
00:32:17.859 --> 00:32:21.119
real numbers as roots, that's not always the case. But
617
00:32:21.180 --> 00:32:25.809
if you allow this extension by using the square root
618
00:32:25.920 --> 00:32:32.390
of minus one as another dimension, then you can always
619
00:32:32.430 --> 00:32:36.150
get two roots. And so there's all kinds of lovely,
620
00:32:36.190 --> 00:32:40.859
beautiful math that just falls into place perfectly when you
621
00:32:40.880 --> 00:32:41.210
do that.
622
00:32:41.690 --> 00:32:42.559
I still don't get it.
623
00:32:42.900 --> 00:32:44.700
I'm remembering enough of this stuff to realize, as soon
624
00:32:44.720 --> 00:32:46.980
as you said imaginary numbers, like square root of negative two,
625
00:32:47.500 --> 00:32:50.240
that shouldn't be possible, but there's a fix for it.
626
00:32:50.440 --> 00:32:55.119
Yeah. So it's not purely mathematical. It's actually some, like
627
00:32:55.440 --> 00:32:58.019
most of quantum physics is also expressed in quantum, in, uh,
628
00:32:58.470 --> 00:33:02.400
in terms of complex numbers. So, how real that is
629
00:33:02.460 --> 00:33:05.539
is also questionable, but that's a different discussion.
630
00:33:06.660 --> 00:33:08.819
Well, you know, God doesn't play dice with the universe.
631
00:33:10.220 --> 00:33:12.650
Would you consider yourself a philosopher of math?
632
00:33:12.869 --> 00:33:14.089
A little bit, but not too much.
633
00:33:14.569 --> 00:33:19.190
Not the philosopher king, just a philosopher. No.
634
00:33:20.890 --> 00:33:25.720
The pure math and the computer math are actually very different.
635
00:33:26.089 --> 00:33:27.329
It's a very different story.
636
00:33:27.430 --> 00:33:28.609
Oh, sure, yeah.
637
00:33:28.750 --> 00:33:33.059
You don't get into extreme abstractions that only a handful
638
00:33:33.079 --> 00:33:34.299
of people understand.
639
00:33:35.240 --> 00:33:38.299
But as I understand it, mathematics and computing in general
640
00:33:38.380 --> 00:33:41.440
has been a series of compromises based on the limitations
641
00:33:42.160 --> 00:33:43.660
of the hardware available at the time.
642
00:33:44.000 --> 00:33:44.660
Yes, that's right.
643
00:33:45.009 --> 00:33:45.589
And the language.
644
00:33:46.490 --> 00:33:52.289
Language, too. There's actually funny stories about Fortran, the first
645
00:33:52.349 --> 00:34:00.420
programming language, which has... Originally, it didn't have if statements.
646
00:34:00.640 --> 00:34:04.059
It had a conditional jump. It didn't have.
647
00:34:06.910 --> 00:34:12.449
The logical operators and the comparison operators are written out
648
00:34:12.789 --> 00:34:16.570
with dots. Dot, L, T, dot is less than. The
649
00:34:16.590 --> 00:34:21.469
reason they did that was because at the time... computers
650
00:34:21.510 --> 00:34:23.449
didn't have less than signs.
651
00:34:23.829 --> 00:34:26.530
Right. The ASCII set hadn't been done yet.
652
00:34:26.690 --> 00:34:27.130
That's right.
653
00:34:27.389 --> 00:34:27.650
Wow.
654
00:34:27.829 --> 00:34:28.670
Was it EPSIDIC?
655
00:34:29.670 --> 00:34:30.789
Even earlier.
656
00:34:30.869 --> 00:34:36.070
Another interesting thing about Fortran, white space doesn't matter at all.
657
00:34:36.349 --> 00:34:36.630
Right.
658
00:34:36.869 --> 00:34:39.170
You can put spaces anywhere in the middle of a name,
659
00:34:39.190 --> 00:34:45.030
of a variable, anywhere. The reason they did that is
660
00:34:45.110 --> 00:34:52.179
because back in the day, people wrote their programs on
661
00:34:52.300 --> 00:34:57.090
punch cards and there were punch card operators who translated
662
00:34:57.110 --> 00:35:04.809
or like who entered the text in punch cards, did
663
00:35:04.829 --> 00:35:11.139
the punching to then feed into the computers. And what
664
00:35:11.179 --> 00:35:15.099
they found was that they were very sloppy with spaces
665
00:35:15.460 --> 00:35:18.500
in the transcriptions. And so there were lots of errors
666
00:35:19.340 --> 00:35:24.539
because spaces were at the time significant. And so they
667
00:35:24.559 --> 00:35:27.440
did away with that so that their programs could actually run.
668
00:35:27.920 --> 00:35:28.719
It's a workaround.
669
00:35:28.960 --> 00:35:29.139
Yeah.
670
00:35:29.420 --> 00:35:32.900
And speaking of languages, how does JavaScript hit you for
671
00:35:32.920 --> 00:35:33.719
a math language?
672
00:35:35.599 --> 00:35:38.500
JavaScript is kind of, it's not.
673
00:35:38.519 --> 00:35:39.039
You can say it.
674
00:35:39.340 --> 00:35:39.840
It's okay.
675
00:35:40.760 --> 00:35:43.059
It's not the best language for computing.
676
00:35:43.099 --> 00:35:43.739
Yeah, right.
677
00:35:43.840 --> 00:35:46.280
The nice thing about it is that you have numbers
678
00:35:46.360 --> 00:35:49.360
and they're all the same. But that's when you do
679
00:35:49.429 --> 00:35:51.960
numerical stuff, that's also the, The problem.
680
00:35:52.219 --> 00:35:52.900
Right. Yeah.
681
00:35:53.179 --> 00:35:53.980
As we found out.
682
00:35:54.619 --> 00:35:57.300
We've talked a little bit about complex numbers so far
683
00:35:57.719 --> 00:36:01.480
in the library here. I don't know that I exactly
684
00:36:01.559 --> 00:36:05.139
understand everything when we talk about space of complex numbers. Because,
685
00:36:05.760 --> 00:36:07.699
I mean, I've always thought that not a number, you know,
686
00:36:07.719 --> 00:36:11.530
speaking of JavaScript, was such a computer thing. But is
687
00:36:11.570 --> 00:36:14.449
that something relevant in complex numbers as well?
688
00:36:14.750 --> 00:36:18.150
It's relevant in all of numerical computing.
689
00:36:18.679 --> 00:36:19.059
Oh, okay.
690
00:36:19.119 --> 00:36:21.539
So a complex number just has a real part and
691
00:36:21.559 --> 00:36:22.579
an imaginary part.
692
00:36:22.800 --> 00:36:23.019
Right.
693
00:36:23.409 --> 00:36:26.469
And once you work with those two, it's just real
694
00:36:26.510 --> 00:36:30.530
math again. There's nothing complex about it. So the same
695
00:36:31.090 --> 00:36:34.730
issues that you encounter in real numbers, you will encounter
696
00:36:34.750 --> 00:36:36.199
in complex numbers again. Right.
697
00:36:36.659 --> 00:36:40.119
And so problems like infinity and not a number, these
698
00:36:40.159 --> 00:36:41.619
are just things you have to contend with.
699
00:36:41.920 --> 00:36:42.119
Yeah.
700
00:36:42.519 --> 00:36:45.820
And that's one of the weird things. Not a number
701
00:36:46.099 --> 00:36:53.889
is a special thing. encoding in the binary floating point format.
702
00:36:54.579 --> 00:36:59.079
And they compare false. So any operation, any logical operation
703
00:36:59.739 --> 00:37:02.380
with not a number returns false, including itself.
704
00:37:03.960 --> 00:37:06.099
So not a number is also not a number.
705
00:37:06.320 --> 00:37:10.449
Well, yeah. So you have to special case all kinds
706
00:37:10.489 --> 00:37:15.510
of code to work with that to trap it. One
707
00:37:15.530 --> 00:37:18.900
of the Places where you can get not a number
708
00:37:19.219 --> 00:37:22.820
is if you try to compute the square root of
709
00:37:22.860 --> 00:37:23.559
a negative number.
710
00:37:23.880 --> 00:37:24.099
Right.
711
00:37:24.320 --> 00:37:25.800
Does that make an imaginary number?
712
00:37:26.119 --> 00:37:29.420
That would make an imaginary number, but it's outside of
713
00:37:29.519 --> 00:37:31.400
the number format. Right.
714
00:37:31.980 --> 00:37:34.780
I'm starting to feel like in this context, not a
715
00:37:34.800 --> 00:37:39.539
number is problematically like nulls are problematic, where you have
716
00:37:39.579 --> 00:37:42.619
to test for them, and they're hard to test against themselves.
717
00:37:43.460 --> 00:37:45.300
So they just have to build a set of exception
718
00:37:45.320 --> 00:37:45.980
cases around it.
719
00:37:47.159 --> 00:37:51.739
That's true, and it's more of an annoyance than anything.
720
00:37:52.320 --> 00:37:54.599
If you're careful, you won't encounter them.
721
00:37:54.940 --> 00:37:55.159
Right.
722
00:37:55.860 --> 00:38:02.780
But the other challenge is of maintaining precision. If you
723
00:38:02.800 --> 00:38:05.300
can do that, you're good. If you can't, then you
724
00:38:05.320 --> 00:38:08.849
can get things like dividing zero by zero, which is
725
00:38:08.909 --> 00:38:10.230
also not a number.
726
00:38:10.369 --> 00:38:10.949
Not a number.
727
00:38:10.969 --> 00:38:11.570
Yeah.
728
00:38:12.920 --> 00:38:15.360
That's fair. So, I mean, on one hand, I'm losing
729
00:38:15.389 --> 00:38:18.889
this library because I have a particular use case where
730
00:38:18.949 --> 00:38:22.570
I have a particular requirement for precision that perhaps doesn't
731
00:38:22.610 --> 00:38:24.519
fall into what's built into.
732
00:38:24.670 --> 00:38:24.889
NET.
733
00:38:24.969 --> 00:38:26.719
Does that make sense? Is that a reason to go
734
00:38:26.780 --> 00:38:28.079
into using the library?
735
00:38:29.380 --> 00:38:31.440
That's one possibility. We have.
736
00:38:32.800 --> 00:38:37.800
Big floats that can Do enormous ranges of numbers to
737
00:38:37.920 --> 00:38:39.550
whatever precision you want, basically.
738
00:38:39.610 --> 00:38:42.889
How big is a big float there, Jeff? A Google?
739
00:38:44.750 --> 00:38:47.769
I think the exponent is about 10 billion.
740
00:38:48.449 --> 00:38:48.570
Oh.
741
00:38:49.309 --> 00:38:51.909
And you can have like up to a couple of
742
00:38:51.929 --> 00:38:53.349
billion digits, something like that.
743
00:38:53.369 --> 00:38:54.929
So you could calculate with Googles.
744
00:38:55.590 --> 00:38:55.829
Yeah.
745
00:38:56.130 --> 00:38:56.409
Wow.
746
00:38:56.710 --> 00:39:00.389
A Google actually fits in a normal double floating boy number.
747
00:39:00.530 --> 00:39:00.869
Really?
748
00:39:01.070 --> 00:39:01.269
Wow.
749
00:39:01.329 --> 00:39:03.190
If it's 10 to the power 100. Right.
750
00:39:04.239 --> 00:39:09.679
It's not exact. Because we don't have enough bits for that. But, yeah,
751
00:39:09.760 --> 00:39:10.920
it is within the range.
752
00:39:11.500 --> 00:39:14.619
Nice. Okay. But then now when I think about, you know,
753
00:39:14.679 --> 00:39:18.750
why would I want a library like this, I immediately
754
00:39:18.769 --> 00:39:22.869
head towards calculus. Because that's hard to do without a library.
755
00:39:22.989 --> 00:39:23.369
That's right.
756
00:39:23.849 --> 00:39:29.130
Well, more generally, the reason you would go to a
757
00:39:29.190 --> 00:39:35.639
library like this, is that avoiding the loss of precision
758
00:39:36.800 --> 00:39:42.739
is a challenge. Right? So we talked about every operation
759
00:39:42.800 --> 00:39:47.900
introduces potentially another additional small error. Right. There's also something
760
00:39:47.920 --> 00:39:52.900
called catastrophic cancellations. which is you have two numbers that
761
00:39:53.000 --> 00:39:59.300
almost have the same magnitude, and you subtract them. So
762
00:39:59.539 --> 00:40:02.059
the result is very small relative to those two numbers.
763
00:40:02.280 --> 00:40:02.780
Oh, okay.
764
00:40:02.840 --> 00:40:04.889
Well, your precision will plummet.
765
00:40:05.050 --> 00:40:07.210
Yeah, and turn it to a zero when it shouldn't be.
766
00:40:07.429 --> 00:40:07.670
Yeah.
767
00:40:08.150 --> 00:40:08.889
Right, okay.
768
00:40:09.150 --> 00:40:15.030
And then you get into other things like... One of
769
00:40:15.090 --> 00:40:18.420
the biggest challenges for me that I have to be
770
00:40:18.460 --> 00:40:23.130
always aware of is... Computer math is not quite like
771
00:40:23.449 --> 00:40:28.489
regular math. So, for example, the order of operations matters.
772
00:40:30.320 --> 00:40:32.659
In normal math, when you add three numbers, it doesn't
773
00:40:32.679 --> 00:40:34.119
really matter which order you do it in.
774
00:40:34.340 --> 00:40:34.519
No.
775
00:40:34.679 --> 00:40:39.300
But say you have 1 plus 10 to the minus
776
00:40:39.300 --> 00:40:41.079
20 plus minus 1.
777
00:40:41.079 --> 00:40:42.719
Oh, I see the problem already.
778
00:40:42.860 --> 00:40:46.639
So, 1 plus 10 to the minus 20, you don't
779
00:40:46.679 --> 00:40:50.329
have the precision to register that little thing you're adding,
780
00:40:50.750 --> 00:40:53.590
so that remains one. And then if you subtract again,
781
00:40:53.690 --> 00:40:57.000
it's zero. Whereas if you do one minus one and
782
00:40:57.039 --> 00:41:01.059
then add, it's zero plus your small number and you
783
00:41:01.119 --> 00:41:02.400
have a different result.
784
00:41:02.760 --> 00:41:06.940
Because the first item in the list is what defines
785
00:41:07.000 --> 00:41:09.050
the type that it's cast to, right?
786
00:41:09.070 --> 00:41:09.429
That's right.
787
00:41:09.550 --> 00:41:12.889
So the programming language defines the order and you have
788
00:41:12.909 --> 00:41:14.710
to make sure that you do things in the right order.
789
00:41:15.250 --> 00:41:19.050
And that can sneak up on you like A simple expression,
790
00:41:19.070 --> 00:41:22.849
a plus k minus 1, where a is a real number,
791
00:41:22.889 --> 00:41:25.090
k is an integer. That looks innocent, right?
792
00:41:25.670 --> 00:41:25.929
Yeah.
793
00:41:25.989 --> 00:41:29.750
Can't really go wrong with that. Well, what happens if
794
00:41:30.349 --> 00:41:34.139
a is a small number and k equals 1? Then
795
00:41:34.179 --> 00:41:36.860
you're going to have a plus 1. You're going to
796
00:41:36.920 --> 00:41:41.420
lose tons of precision there. And then subtract 1 again.
797
00:41:41.780 --> 00:41:45.599
So you've just lost lots of precision in that simple,
798
00:41:45.739 --> 00:41:47.019
innocent-looking operation.
799
00:41:47.630 --> 00:41:50.730
Yeah, you ended up at zero and it shouldn't have been.
800
00:41:50.889 --> 00:41:51.289
Yeah, or.
801
00:41:53.610 --> 00:41:57.449
Something close, but much less accurate than what you started
802
00:41:57.530 --> 00:41:57.829
out with.
803
00:41:58.110 --> 00:41:58.369
Right.
804
00:41:58.570 --> 00:42:03.369
Is there such a thing as a specialized computer and
805
00:42:03.449 --> 00:42:09.550
language that brings computer math closer to real math?
806
00:42:09.889 --> 00:42:14.159
You could say that there are symbolic computer systems, but
807
00:42:14.179 --> 00:42:15.340
that's really kind of cheating.
808
00:42:15.360 --> 00:42:15.739
Uh-huh.
809
00:42:16.360 --> 00:42:19.440
So I wouldn't say for practical use, not really.
810
00:42:19.460 --> 00:42:22.179
Okay. I mean, wasn't that what Fortran was about, was
811
00:42:22.219 --> 00:42:24.460
trying to get rid of these precision problems back in
812
00:42:24.480 --> 00:42:24.800
the day?
813
00:42:25.860 --> 00:42:30.969
Fortran was to make it easy to write out equations.
814
00:42:31.659 --> 00:42:34.630
It's literally derived from formula translation.
815
00:42:34.929 --> 00:42:35.150
Right.
816
00:42:35.789 --> 00:42:42.550
So eliminating the floating point traps and so on is
817
00:42:42.650 --> 00:42:45.090
really not practical to.
818
00:42:45.030 --> 00:42:48.989
Do in a In a language, you have to sort
819
00:42:49.010 --> 00:42:50.889
of choose your algorithm.
820
00:42:51.690 --> 00:42:51.929
Right.
821
00:42:52.710 --> 00:42:57.230
And so you have to, sometimes you get a formula
822
00:42:57.389 --> 00:43:00.880
and there's something that can blow up or where you
823
00:43:00.889 --> 00:43:03.780
can lose precision. And then you have to find a
824
00:43:04.940 --> 00:43:11.380
different path of obtaining the same result that doesn't have
825
00:43:11.420 --> 00:43:14.559
that problem. And that's the biggest challenge.
826
00:43:14.599 --> 00:43:17.039
Yeah, and so you're no longer just working on the
827
00:43:17.079 --> 00:43:19.340
math problem. You're working in the constraints of the computer.
828
00:43:19.420 --> 00:43:19.780
That's right.
829
00:43:19.940 --> 00:43:21.780
You have to adapt your math problem to what the
830
00:43:21.800 --> 00:43:22.760
computer can do for you.
831
00:43:22.800 --> 00:43:27.199
That's right. And that's why it's hard. That's why so
832
00:43:29.239 --> 00:43:31.199
much time is spent on getting it right.
833
00:43:32.480 --> 00:43:34.940
And the problem is if you're not aware of the problems,
834
00:43:34.960 --> 00:43:37.719
you just write an expression. And in certain test cases,
835
00:43:37.760 --> 00:43:40.949
it works fine. And in other cases, it ruins everything.
836
00:43:41.090 --> 00:43:47.079
Yeah, and... Most cases you'll test are like mid-range, normal,
837
00:43:47.760 --> 00:43:52.650
everyday things. And sure, it'll work fine with that. Like, yeah,
838
00:43:52.670 --> 00:43:55.050
you might lose a digit or two, but nothing relevant.
839
00:43:55.530 --> 00:43:59.610
But then extreme cases happen, and then, yeah, you might
840
00:43:59.630 --> 00:44:00.329
run into trouble.
841
00:44:00.550 --> 00:44:03.550
Disasters. Should we go down some of the paths of these?
842
00:44:04.130 --> 00:44:06.110
different math sets you've done here, I'm just trying to
843
00:44:06.130 --> 00:44:11.469
figure out what a Gauss Cronrod numerical integrator is. You're
844
00:44:11.510 --> 00:44:15.309
making that up, Richard. I wish I was. I'm just
845
00:44:15.409 --> 00:44:19.110
reading through the spec here and going, oh boy. If
846
00:44:19.130 --> 00:44:21.760
you don't know what that is, you probably don't need one.
847
00:44:22.449 --> 00:44:29.300
Yeah, Gauss is the famous mathematician who pioneered numerical integration,
848
00:44:29.320 --> 00:44:31.420
so computing the area under a curve.
849
00:44:32.090 --> 00:44:33.789
Using approximations.
850
00:44:34.090 --> 00:44:35.110
You said Gauss, right?
851
00:44:35.429 --> 00:44:36.570
And Gauss, yeah.
852
00:44:36.849 --> 00:44:39.610
Is that what the Gaussian blur is based on?
853
00:44:39.849 --> 00:44:40.610
That's also him.
854
00:44:40.789 --> 00:44:48.340
Wow. Like anything Gauss, like the Gaussian distribution, Gaussian blur,
855
00:44:48.360 --> 00:44:50.280
all those things are all the same person.
856
00:44:50.619 --> 00:44:52.940
Wow. Right. Clever guy.
857
00:44:53.079 --> 00:44:53.320
Yeah.
858
00:44:53.539 --> 00:44:58.119
So one way to compute errors is you compute the
859
00:44:58.159 --> 00:45:00.610
same result in two different ways, one more accurate than.
860
00:45:00.489 --> 00:45:00.960
The other one.
861
00:45:01.460 --> 00:45:02.599
And then you compare results.
862
00:45:03.039 --> 00:45:03.260
Right.
863
00:45:03.760 --> 00:45:08.300
And Gauss-Krohn wrote is a way of doing that with
864
00:45:08.400 --> 00:45:13.150
reusing some of the calculations you've done so that you've,
865
00:45:14.550 --> 00:45:17.949
so to minimize extra work. So that's what that is.
866
00:45:18.289 --> 00:45:21.349
No, and I appreciate that. So now I'm thinking the
867
00:45:21.369 --> 00:45:24.489
software engineer in me is like, okay. We measure this
868
00:45:24.570 --> 00:45:26.849
particular problem space in two different ways and then use
869
00:45:26.869 --> 00:45:28.809
an integrator to get what we think is the most
870
00:45:28.909 --> 00:45:29.989
accurate possible answer.
871
00:45:30.150 --> 00:45:30.510
That's right.
872
00:45:30.670 --> 00:45:32.889
Yeah, smart. And it's good to have a tool. You
873
00:45:32.909 --> 00:45:34.880
could try and code your way around that. You'd probably
874
00:45:34.889 --> 00:45:36.219
screw it up. Use the tool.
875
00:45:36.340 --> 00:45:36.739
That's right.
876
00:45:36.989 --> 00:45:41.239
And so that particular one is used for what's called
877
00:45:41.260 --> 00:45:47.360
adaptive integration, which means if you have a curve that's
878
00:45:47.440 --> 00:45:51.739
really oscillating a lot, like changes very quickly, if you
879
00:45:51.989 --> 00:45:54.750
try to approximate it with a few points, you're going
880
00:45:54.769 --> 00:45:59.250
to be way off. And so by computing the error,
881
00:45:59.289 --> 00:46:03.369
you can say, okay, we're good in this part of
882
00:46:03.389 --> 00:46:06.590
the function, but here we need to dig deeper and
883
00:46:06.639 --> 00:46:11.360
be more precise. So you do a recalculation there. What's
884
00:46:11.420 --> 00:46:14.780
the error now? And you keep doing that until your
885
00:46:14.800 --> 00:46:16.239
result is accurate enough.
886
00:46:16.900 --> 00:46:17.880
Accurate enough.
887
00:46:18.840 --> 00:46:23.860
I imagine FFTs, Fast Fourier transforms. I only know a
888
00:46:23.889 --> 00:46:26.280
lot of this stuff because, you know, the Gaussian blur
889
00:46:26.320 --> 00:46:28.579
you use in Photoshop and other things like that. And
890
00:46:28.659 --> 00:46:33.639
the FFTs we use in noise reduction algorithms in Adobe Audition.
891
00:46:34.199 --> 00:46:37.380
And I've been using them ever since I've been recording
892
00:46:37.420 --> 00:46:44.440
with digital audio. But from what I understand about noise reduction,
893
00:46:44.480 --> 00:46:48.880
it uses a fast Fourier transform and you select the
894
00:46:48.920 --> 00:46:52.019
number of points. And what it does in the audio
895
00:46:52.059 --> 00:46:56.409
world is it acts as, let's say it's 8,000 points.
896
00:46:57.050 --> 00:47:04.750
It's an 8,000 band compressor, right? So you have a
897
00:47:04.769 --> 00:47:09.010
compressor with three bands, high, low, and mid, or high, mid,
898
00:47:09.070 --> 00:47:12.730
and low, whatever. But if you break that up into
899
00:47:13.150 --> 00:47:18.650
the frequency spectrum into 8,000 bands, then it can compress
900
00:47:19.170 --> 00:47:23.829
each band. band individually using a fast Fourier transform I
901
00:47:23.869 --> 00:47:26.230
don't know how but I know it works.
902
00:47:27.590 --> 00:47:35.500
Fourier transform basically turns a signal into its frequencies and
903
00:47:35.539 --> 00:47:37.940
so then you can filter out high frequencies or mid
904
00:47:38.000 --> 00:47:44.199
or low or like apply equalizers and then transform back
905
00:47:45.019 --> 00:47:48.119
to get your new signal with the high frequencies filtered
906
00:47:48.219 --> 00:47:48.769
out Right.
907
00:47:48.829 --> 00:47:51.269
Makes a lot of sense, especially we use an 8K
908
00:47:51.789 --> 00:47:55.210
FFT size for noise reduction. Always have. And it seemed
909
00:47:55.230 --> 00:47:58.559
to be the sweet spot for audio, for speaking anyway.
910
00:47:59.440 --> 00:48:00.519
Just one of those things.
911
00:48:00.920 --> 00:48:01.119
Yeah.
912
00:48:01.360 --> 00:48:04.579
Wow. Should we, some other areas to explore here, Jeff?
913
00:48:04.619 --> 00:48:05.949
What do you want to, what would you like to
914
00:48:05.989 --> 00:48:09.429
talk about? Maybe some Jebyshev polynomials?
915
00:48:09.869 --> 00:48:12.349
Jebyshev is one of the luckiest people in the world.
916
00:48:14.230 --> 00:48:16.219
This is a mathematician, I presume.
917
00:48:16.360 --> 00:48:21.960
He's a mathematician. I'm not even sure which century he's from.
918
00:48:22.260 --> 00:48:22.500
Right.
919
00:48:22.880 --> 00:48:27.719
But he played with a certain type of polynomials that
920
00:48:28.929 --> 00:48:32.329
looked interesting. And so they ended up being named after him.
921
00:48:33.449 --> 00:48:37.429
And these days they're used all over the place. Right.
922
00:48:38.349 --> 00:48:43.559
Because they're defining property. What makes them useful is that
923
00:48:44.539 --> 00:48:49.539
They're very even. They oscillate, yes, but they oscillate within
924
00:48:49.559 --> 00:48:55.039
a narrow band, and it's the narrowest possible band. Oh, interesting.
925
00:48:55.340 --> 00:49:02.170
JPL uses that for their planetary models. They will give
926
00:49:02.269 --> 00:49:08.789
out positions of planets and asteroids and everything as a
927
00:49:08.949 --> 00:49:18.429
series of Cheverchev polynomials. because you can very accurately model
928
00:49:19.289 --> 00:49:23.650
basically any curve using them. And what I was saying
929
00:49:23.710 --> 00:49:32.510
about controlling the growth of your errors, they're extremely favorable
930
00:49:32.550 --> 00:49:36.789
that way. So you will get minimal error propagation, which is, again, why.
931
00:49:36.650 --> 00:49:39.650
They're so common. I looked him up. He was a
932
00:49:39.710 --> 00:49:40.340
Russian from the 1800s.
933
00:49:40.389 --> 00:49:40.610
Yeah.
934
00:49:40.630 --> 00:49:45.670
Sounds right. That's a lot of mathematicians, actually, I think.
935
00:49:45.889 --> 00:49:48.630
And he was at a time of defining all this stuff. So, again,
936
00:49:49.230 --> 00:49:51.510
you've come back to this a few times, Jeff. It's
937
00:49:51.550 --> 00:49:55.449
like you're trying to work through a set of data
938
00:49:55.469 --> 00:49:58.360
and get an aggregate or some kind of valuation from
939
00:49:58.400 --> 00:49:59.880
it without introducing a lot of error.
940
00:50:00.059 --> 00:50:00.260
Yeah.
941
00:50:00.320 --> 00:50:02.159
And these are the kinds of tools you use to
942
00:50:02.179 --> 00:50:02.940
try and keep the errors.
943
00:50:03.019 --> 00:50:06.900
And the problem is, too– As I said earlier, as
944
00:50:06.940 --> 00:50:10.420
soon as you bring a real world number into your
945
00:50:10.460 --> 00:50:14.510
computing system, you have some deviation from reality. And there's
946
00:50:14.550 --> 00:50:15.489
another famous.
947
00:50:15.650 --> 00:50:17.889
Because the computer does an approximation on it.
948
00:50:17.969 --> 00:50:18.550
Yeah.
949
00:50:19.329 --> 00:50:24.010
There's another famous and rather tragic example from the Gulf
950
00:50:24.030 --> 00:50:28.610
War in 1991. There was a Scud missile heading towards
951
00:50:28.630 --> 00:50:34.070
a U.S. base in Tehran in Saudi Arabia. And they
952
00:50:34.090 --> 00:50:38.550
had a Patriot system. for air defense, but it failed,
953
00:50:38.630 --> 00:50:44.539
it missed. And the reason it missed was round off error.
954
00:50:45.400 --> 00:50:50.260
They were counting time by incrementing a counter every tenth
955
00:50:50.280 --> 00:50:53.980
of a second. So after about four days, the counter
956
00:50:54.019 --> 00:50:57.630
was at something like three and a half million. And
957
00:50:57.670 --> 00:51:03.849
then they computed the current time by multiplying that counter
958
00:51:03.869 --> 00:51:09.989
by by 0.1. 0.1 is not a floating point number,
959
00:51:10.090 --> 00:51:12.929
not a binary floating point number. So there's this very
960
00:51:13.010 --> 00:51:18.829
tiny error there of about 95 nanoseconds. But when you
961
00:51:18.869 --> 00:51:24.010
multiply 9 to 5 nanoseconds by 3.5 million, you get
962
00:51:24.050 --> 00:51:28.360
about three-tenths of a second. And missiles fly very fast
963
00:51:28.380 --> 00:51:31.119
and cover a lot of ground in that time. And
964
00:51:31.179 --> 00:51:35.949
so the interceptor missed And unfortunately, I think 28 people
965
00:51:35.969 --> 00:51:41.400
died in that attack. So, it can have very serious consequences.
966
00:51:41.940 --> 00:51:42.599
Yeah, no kidding.
967
00:51:42.880 --> 00:51:45.960
We were talking about in the news stories, Boeing and
968
00:51:45.980 --> 00:51:50.300
the problems that they had. And I wonder if, I mean,
969
00:51:50.320 --> 00:51:56.969
it was obvious incompetence in a culture of, you know,
970
00:51:57.090 --> 00:52:00.170
not reporting the truth and trying to appease the higher-ups
971
00:52:00.230 --> 00:52:03.780
and all that stuff and sycophancy, but I wonder if
972
00:52:04.119 --> 00:52:10.539
any of that stemmed from having bad algorithms or bad math.
973
00:52:11.440 --> 00:52:11.800
Do you know?
974
00:52:12.840 --> 00:52:20.920
I have no idea. There have been mistakes with the
975
00:52:20.960 --> 00:52:24.699
Ariane rocket and the example you gave too earlier.
976
00:52:24.780 --> 00:52:26.920
Sure, which I think is a really interesting one just
977
00:52:26.940 --> 00:52:30.010
because they– changed the precision on the number and then
978
00:52:30.369 --> 00:52:32.650
introduced it into a different rocket that behaved differently and
979
00:52:32.829 --> 00:52:35.909
that number suddenly was a huge problem. And more importantly,
980
00:52:35.929 --> 00:52:39.409
the software doesn't get an overflow and the software just
981
00:52:39.449 --> 00:52:42.269
treats it as a number still, not acknowledging that, no,
982
00:52:42.289 --> 00:52:44.920
that's not a valid number and you should stop what
983
00:52:44.940 --> 00:52:46.539
you're doing. Whatever you do from here is going to
984
00:52:46.579 --> 00:52:52.179
be worse, not better. The MCAS story, which was part
985
00:52:52.199 --> 00:52:54.760
of that 737 MAX problem, is a complicated one and
986
00:52:54.800 --> 00:52:59.079
probably none Appropriate here, but yeah, it was the decision
987
00:52:59.159 --> 00:53:03.039
on hardware and software and how you communicated to the
988
00:53:03.099 --> 00:53:07.429
pilots combined that creates that situation.
989
00:53:07.849 --> 00:53:13.710
Speaking of radiation doses, there's also a story about a
990
00:53:13.789 --> 00:53:20.880
system to administer the radiation where some people got bad
991
00:53:20.920 --> 00:53:26.019
burns and it turned out They looked into it, maybe
992
00:53:26.079 --> 00:53:28.619
as the operator not experienced. And no, the operator is
993
00:53:28.659 --> 00:53:32.179
very experienced. And actually that turned out to be the
994
00:53:32.219 --> 00:53:36.940
problem because they entered the information so quickly that the
995
00:53:36.980 --> 00:53:42.360
system couldn't keep up and skipped an input. And that
996
00:53:42.420 --> 00:53:50.699
led to overdoses. So there's all kinds of like the
997
00:53:50.739 --> 00:53:53.800
numerical part is one thing, but there's also the good
998
00:53:54.000 --> 00:54:01.789
software practices of making allowances for exceptions and treating exceptional
999
00:54:01.829 --> 00:54:05.010
conditions adequately and correctly.
1000
00:54:05.269 --> 00:54:10.949
Yeah. Yeah. It's interesting to try and write software that
1001
00:54:11.010 --> 00:54:13.079
contends with that kind of thing because the consequence was
1002
00:54:13.119 --> 00:54:17.500
so serious. You know, they're just sort of recognizing that
1003
00:54:17.559 --> 00:54:23.449
the data doesn't make sense. What's reasonable. before it actually runs.
1004
00:54:24.369 --> 00:54:30.030
The Therac-25 issue, that was the radiation treatment where if
1005
00:54:30.050 --> 00:54:33.630
you entered the data too quickly, software went into a
1006
00:54:33.650 --> 00:54:34.309
race condition.
1007
00:54:35.250 --> 00:54:38.650
And one thing they did, I believe, in that instance
1008
00:54:38.789 --> 00:54:46.179
is the previous version of that equipment had hardware guards. Right.
1009
00:54:46.380 --> 00:54:50.239
So if the radiation was too high or voltage or
1010
00:54:50.320 --> 00:54:54.949
whichever way they measured it, it would refuse to do that.
1011
00:54:55.449 --> 00:54:57.510
But they took those off and they replaced them with
1012
00:54:57.550 --> 00:55:01.150
software tests. That obviously didn't work.
1013
00:55:01.550 --> 00:55:03.929
Yeah, obviously created other consequences, no question.
1014
00:55:04.329 --> 00:55:08.449
So your point is well taken. Math is kind of important.
1015
00:55:08.489 --> 00:55:14.780
To get right. Well, yeah, precision. I don't know that
1016
00:55:14.820 --> 00:55:18.920
we even now actually understand fully the compromises that were
1017
00:55:18.960 --> 00:55:21.019
made to store numbers in computers efficiently.
1018
00:55:22.679 --> 00:55:26.599
They did a pretty good job, actually, with the standard
1019
00:55:28.579 --> 00:55:37.769
IEEE 754 format. In some ways, it's quite ingenious. The numerical,
1020
00:55:37.929 --> 00:55:40.829
if you compare the bit value, if you look at
1021
00:55:40.869 --> 00:55:46.340
it as a 64-bit integer, it is in the correct
1022
00:55:46.380 --> 00:55:50.820
sort order. So you can compare the numbers as integers
1023
00:55:50.840 --> 00:55:54.710
and and have the correct sort order, except for.
1024
00:55:54.630 --> 00:56:00.090
The not a number cases, which are an annoyance.
1025
00:56:01.250 --> 00:56:06.260
And there's another problem that's not obvious at first sight.
1026
00:56:07.940 --> 00:56:10.760
Because of the format, you always have an integer times
1027
00:56:10.800 --> 00:56:14.219
a power of two. And so there are as many
1028
00:56:14.619 --> 00:56:18.469
floating point numbers between one and two as there are
1029
00:56:18.530 --> 00:56:23.380
between two and four, or four and eight. in 16,
1030
00:56:23.380 --> 00:56:29.099
so they've become scarcer and sparser, the more, the larger
1031
00:56:29.119 --> 00:56:31.840
your numbers get, and they get closer and closer together.
1032
00:56:31.860 --> 00:56:34.780
The smaller your numbers get.
1033
00:56:36.280 --> 00:56:38.400
And then the question is, well, what do you do
1034
00:56:38.440 --> 00:56:43.570
close to zero? And the solution they found was, well,
1035
00:56:44.489 --> 00:56:48.829
let's just switch from a floating point format into two
1036
00:56:49.309 --> 00:56:52.500
times a power of two. to a fixed point format.
1037
00:56:53.860 --> 00:57:01.349
And so all the numbers with exponent zero are called
1038
00:57:01.630 --> 00:57:07.050
subnormal numbers and they are a fixed point format. So
1039
00:57:07.070 --> 00:57:11.610
they are that number interpreted as an integer times, I
1040
00:57:11.630 --> 00:57:12.329
think it's two to.
1041
00:57:12.250 --> 00:57:13.250
The power minus 1,075.
1042
00:57:13.250 --> 00:57:19.590
So that when you get to zero, You have what
1043
00:57:19.610 --> 00:57:22.980
they call gradual underflow. You don't just cut to zero
1044
00:57:23.000 --> 00:57:27.579
straight away. You have like a little bit of breathing
1045
00:57:27.619 --> 00:57:29.000
room to get there.
1046
00:57:29.820 --> 00:57:31.900
Yeah, this is way more complicated than you think about.
1047
00:57:31.920 --> 00:57:33.409
Most of the time we just use numbers and don't
1048
00:57:33.429 --> 00:57:35.949
worry about it. Sometimes you want integers and sometimes you
1049
00:57:35.969 --> 00:57:40.829
want floating point and you're fine. But then this is here.
1050
00:57:41.010 --> 00:57:43.550
I've just looked at this huge roster of capabilities that
1051
00:57:43.590 --> 00:57:47.019
are in all these exception cases. All right. How do
1052
00:57:47.039 --> 00:57:49.039
people figure out they need your tool, Jeff?
1053
00:57:49.280 --> 00:57:56.050
Well, most people just need some kind of calculation where
1054
00:57:56.090 --> 00:58:01.710
they need the level of extraction that our library provides.
1055
00:58:02.250 --> 00:58:06.630
So if you have to solve a set of equations, okay,
1056
00:58:06.650 --> 00:58:10.230
you can do it all yourself and try to figure
1057
00:58:10.250 --> 00:58:11.909
out how to do it efficiently.
1058
00:58:11.929 --> 00:58:12.389
Mm-hmm.
1059
00:58:12.869 --> 00:58:15.150
Or you can use my library and just say, okay,
1060
00:58:15.170 --> 00:58:16.860
these are a number of delegates.
1061
00:58:17.199 --> 00:58:19.300
And to be clear, your library is not free.
1062
00:58:19.619 --> 00:58:20.059
No, it's not.
1063
00:58:20.360 --> 00:58:22.860
Yeah. And not that I have a problem with that.
1064
00:58:22.880 --> 00:58:24.460
It makes sense. It sounds like you've done a ton
1065
00:58:24.500 --> 00:58:28.380
of work. And it's worth it for the folks. If
1066
00:58:28.420 --> 00:58:30.070
you need it, you need it. And you should pay
1067
00:58:30.090 --> 00:58:30.239
for it.
1068
00:58:30.250 --> 00:58:31.769
If you need it, you need it. That's right.
1069
00:58:31.789 --> 00:58:32.150
That's right.
1070
00:58:33.349 --> 00:58:35.369
This is literally a tool to save lives and stop
1071
00:58:35.389 --> 00:58:36.809
spacecraft from exploding. Yeah.
1072
00:58:37.969 --> 00:58:42.130
Yeah. talk about performance a little bit. Uh, some of the,
1073
00:58:42.269 --> 00:58:45.349
I mean, the.net framework has gotten more and more performant
1074
00:58:45.369 --> 00:58:48.880
with every release. Was there ever a time when you considered,
1075
00:58:49.139 --> 00:58:51.699
you know, dropping to assembler to do stuff because it
1076
00:58:51.760 --> 00:58:52.800
wasn't fast enough?
1077
00:58:52.940 --> 00:58:56.440
Well, we've been doing this for 20 years and, um,
1078
00:58:58.199 --> 00:59:05.400
we've seen a few performance, uh, concepts come and go.
1079
00:59:05.400 --> 00:59:07.760
Uh, when, uh.
1080
00:59:07.769 --> 00:59:14.420
The uh, task parallel library was first introduced around 2010,
1081
00:59:14.420 --> 00:59:18.039
that seemed to be the thing to speed things up. Uh,
1082
00:59:18.260 --> 00:59:21.099
turned out there was so much overhead that it was
1083
00:59:21.239 --> 00:59:26.500
limited in what we could do with it. Um, so
1084
00:59:27.380 --> 00:59:31.530
one example of where I did, um, role my own,
1085
00:59:31.590 --> 00:59:38.130
so to speak, is big integer. The initial implementation that
1086
00:59:38.300 --> 00:59:46.260
shift with. NET 4.0 in 2010 was adequate for small sizes,
1087
00:59:46.300 --> 00:59:52.099
but as soon as your numbers got large, it got
1088
00:59:52.900 --> 00:59:58.440
slower and slower. And so we did some work there
1089
00:59:58.480 --> 01:00:03.230
to make a faster version of that, But I really
1090
01:00:03.269 --> 01:00:04.150
have to give it to the.
1091
01:00:04.369 --> 01:00:05.010
NET guys.
1092
01:00:05.230 --> 01:00:08.550
In recent years, they've done so much to bring their
1093
01:00:08.590 --> 01:00:17.619
numerical side of things forward into what's actually now to
1094
01:00:17.659 --> 01:00:21.619
the point where we're considering giving up our big integer
1095
01:00:21.980 --> 01:00:22.860
and just using the.
1096
01:00:22.960 --> 01:00:24.079
NET standard version.
1097
01:00:25.500 --> 01:00:28.989
Do you utilize span of t? I know that's a
1098
01:00:29.050 --> 01:00:29.909
huge win.
1099
01:00:29.929 --> 01:00:31.309
We use it all the time.
1100
01:00:31.630 --> 01:00:31.849
Yeah.
1101
01:00:31.989 --> 01:00:32.329
Oh, wow.
1102
01:00:32.550 --> 01:00:36.150
All the time because, well, one of the advantages, too,
1103
01:00:36.349 --> 01:00:41.360
is a span can be over managed memory, but it
1104
01:00:41.380 --> 01:00:44.980
can also be over unmanaged memory, like anything you get
1105
01:00:45.039 --> 01:00:53.119
from a third-party library or application. And so using span
1106
01:00:53.239 --> 01:00:58.510
allows us to use the same code for– Managed memory,
1107
01:00:59.329 --> 01:01:02.670
so vectors stored in managed memory or in native memory.
1108
01:01:03.829 --> 01:01:07.230
And then the performance, too, it's very compact. It lets you,
1109
01:01:08.170 --> 01:01:11.469
and it's very much optimized more and more. It's actually
1110
01:01:11.489 --> 01:01:16.760
interesting when we look at our test suite. You can
1111
01:01:16.860 --> 01:01:18.690
see we still support.
1112
01:01:18.679 --> 01:01:20.059
NET 4.6.2 and. NET standards.
1113
01:01:25.139 --> 01:01:27.739
And you can see in our execution times of the
1114
01:01:27.780 --> 01:01:31.219
test suite how long it takes for each edition.
1115
01:01:32.570 --> 01:01:33.090
To run.
1116
01:01:34.250 --> 01:01:39.849
And without even changing any code, you can see a
1117
01:01:39.889 --> 01:01:45.300
progression by like every edition is like 10% faster overall.
1118
01:01:46.099 --> 01:01:47.719
And it's just a runtime that does that.
1119
01:01:47.940 --> 01:01:51.820
Yep. And overhead, memory overhead has also gone way down.
1120
01:01:52.039 --> 01:01:52.880
Yeah.
1121
01:01:53.119 --> 01:01:56.530
Just wonderful. Well, it's good to see that you picked
1122
01:01:56.550 --> 01:01:57.190
the right horse.
1123
01:01:58.230 --> 01:01:59.489
Yeah, 20-plus year run.
1124
01:02:00.030 --> 01:02:01.170
Yeah.
1125
01:02:01.409 --> 01:02:04.989
I'm very impressed with the work they've been doing. And
1126
01:02:05.050 --> 01:02:12.469
also in the library itself, when, again, Complex Numbers first.
1127
01:02:12.269 --> 01:02:13.800
Came out, also in.
1128
01:02:13.429 --> 01:02:20.849
NET 4, it was really like you're– textbook or school
1129
01:02:20.869 --> 01:02:26.280
book implementation. It was just the formulas without really understanding
1130
01:02:26.340 --> 01:02:28.559
the intricacies of.
1131
01:02:30.099 --> 01:02:31.559
How to get precise results.
1132
01:02:32.699 --> 01:02:36.219
Even in there, when you computed the square root of
1133
01:02:36.260 --> 01:02:41.949
minus one, which should be purely imaginary I, because that's
1134
01:02:41.969 --> 01:02:46.550
the definition of the imaginary unit, it was off, it
1135
01:02:46.590 --> 01:02:52.150
wasn't correct. But in the last couple of years, and
1136
01:02:52.210 --> 01:02:56.650
now with. NET 11, they've done a ton of work
1137
01:02:56.730 --> 01:03:01.650
to clean that up. And we're not quite ready to
1138
01:03:01.710 --> 01:03:10.280
give up our complex number implementation, but we're seriously considering it. So, again,
1139
01:03:10.920 --> 01:03:12.500
great job,. NET team.
1140
01:03:12.679 --> 01:03:14.280
We should pass it along to Steve and Todd. Those
1141
01:03:14.320 --> 01:03:15.420
guys are freaking brilliant.
1142
01:03:15.619 --> 01:03:19.429
They are, yeah. Well, Jeffrey, thanks for hanging with us.
1143
01:03:19.929 --> 01:03:22.130
We went a little bit over, but that's only because
1144
01:03:22.190 --> 01:03:24.769
we had such a long intro. But it was great
1145
01:03:24.849 --> 01:03:29.219
just going through your interview without an interruption. And this
1146
01:03:29.320 --> 01:03:32.860
is awesome stuff. And I'm actually a little impressed with
1147
01:03:32.960 --> 01:03:34.840
both Richard and I for keeping up with you.
1148
01:03:35.980 --> 01:03:37.860
I think Jeff is a great explainer.
1149
01:03:37.920 --> 01:03:38.760
You are, yeah.
1150
01:03:38.800 --> 01:03:39.840
Which I really appreciate.
1151
01:03:40.679 --> 01:03:41.119
Thank you.
1152
01:03:41.460 --> 01:03:43.789
And good luck in the future. And thanks very much.
1153
01:03:43.849 --> 01:03:44.269
Thank you.
1154
01:03:44.309 --> 01:03:47.889
And we will talk to you dear listener next time on.
1155
01:03:47.599 --> 01:03:48.619
NET Rocks.
1156
01:04:10.340 --> 01:04:13.039
NET Rocks is brought to you by Franklin's Net and
1157
01:04:13.099 --> 01:04:17.800
produced by Plop Studios. a full-service audio, video, and post-production
1158
01:04:17.840 --> 01:04:21.849
facility located physically in New London, Connecticut, and, of course,
1159
01:04:21.909 --> 01:04:30.050
in the cloud, online at pwop.com. Visit our website at dotnetrocks.com
1160
01:04:30.489 --> 01:04:35.170
for RSS feeds, downloads, mobile apps, comments, and access to
1161
01:04:35.190 --> 01:04:38.590
the full archives going back to show number one, recorded
1162
01:04:38.630 --> 01:04:42.489
in September 2002. And make sure you check out our sponsors.
1163
01:04:42.769 --> 01:04:46.139
They keep us in business. Now go write some code.
1164
01:04:46.179 --> 01:04:46.820
See you next time.
1
00:00:01.169 --> 00:00:04.790
How'd you like to listen to. NET Rocks with no ads? Easy.
2
00:00:05.370 --> 00:00:08.769
Become a patron. For just $ 5 a month, you get
3
00:00:08.890 --> 00:00:11.720
access to a private RSS feed where all the shows
4
00:00:11.800 --> 00:00:14.900
have no ads. $ 20 a month will get you that
5
00:00:15.119 --> 00:00:18.839
and a special. NET Rocks patron mug. Sign up now
6
00:00:18.899 --> 00:00:37.149
at patreon.dotnetrocks.com. Hey, and welcome back to. NET Rocks. I'm
7
00:00:37.200 --> 00:00:37.909
Carl Franklin.
8
00:00:38.030 --> 00:00:38.789
And I'm Richard Cavill.
9
00:00:38.969 --> 00:00:44.969
We have been doing this stupid show for 2019 episodes.
10
00:00:45.990 --> 00:00:46.990
What is wrong with us?
11
00:00:47.409 --> 00:00:50.600
I don't know. It's a pattern. And this, you know, yeah,
12
00:00:51.060 --> 00:00:53.640
can kind of anticipate that sometime next week might be
13
00:00:53.659 --> 00:00:54.039
another one.
14
00:00:54.340 --> 00:00:55.859
You know, I say it's a stupid show. I got
15
00:00:55.880 --> 00:00:59.979
to admit, it got a lot smarter after episode 100.
16
00:00:59.979 --> 00:01:02.429
I don't know why, but I don't know why. It
17
00:01:02.469 --> 00:01:06.799
was really stupid. Before that. There was a period. I
18
00:01:07.840 --> 00:01:10.930
remember drawing you out a Venn diagram. It's like, here
19
00:01:10.969 --> 00:01:14.709
are the people who like a technical interview. Here are
20
00:01:14.769 --> 00:01:18.269
the people that like music and comedy and so forth.
21
00:01:18.349 --> 00:01:21.829
And the intersection between the two is small. Very small.
22
00:01:22.090 --> 00:01:22.310
Yeah.
23
00:01:22.450 --> 00:01:25.260
Okay. So, we made two shows.
24
00:01:25.859 --> 00:01:30.579
Yeah. Spoiler alert. We are fixing to make a new Mondays.
25
00:01:31.049 --> 00:01:32.930
Oh, don't give it away, man. I just did. It
26
00:01:32.950 --> 00:01:34.730
might even be out by the time this thing publishes,
27
00:01:34.750 --> 00:01:35.290
but who knows?
28
00:01:35.709 --> 00:01:35.989
Maybe.
29
00:01:36.170 --> 00:01:36.409
Maybe.
30
00:01:36.430 --> 00:01:36.709
Who knows?
31
00:01:37.269 --> 00:01:37.489
All right.
32
00:01:37.530 --> 00:01:42.459
Well, this being episode 2019, we are going to talk
33
00:01:42.519 --> 00:01:45.280
about what happened in 2019. And by the way, Jeffrey
34
00:01:45.319 --> 00:01:46.920
Sachs is with us, and I just want to invite
35
00:01:46.959 --> 00:01:49.420
Jeffrey to jump in if he wants to during this whole.
36
00:01:49.519 --> 00:01:52.680
He probably remembers 2019, too. It was not that long ago.
37
00:01:52.879 --> 00:01:54.040
It was not that long ago.
38
00:01:54.359 --> 00:01:56.540
All right. So, believe it or not, I have a
39
00:01:56.620 --> 00:01:59.849
few good news stories. For 2019. Nice.
40
00:01:59.870 --> 00:02:02.780
You get tired of being the harbinger of doom, do you?
41
00:02:03.540 --> 00:02:04.359
Not your style at all.
42
00:02:04.719 --> 00:02:08.039
I am. Yeah, especially last 2018 was just dark.
43
00:02:08.419 --> 00:02:09.939
Just depressing. Yeah.
44
00:02:10.259 --> 00:02:12.740
So I will have some bad news too, but for
45
00:02:12.780 --> 00:02:16.710
some good. The world's first malaria vaccine began rolling out
46
00:02:16.750 --> 00:02:17.610
in Africa.
47
00:02:17.710 --> 00:02:18.069
Exciting.
48
00:02:18.169 --> 00:02:22.810
Malawi, Ghana, and Kenya began vaccinating children with RTSS, the
49
00:02:22.870 --> 00:02:25.780
first malaria vaccine used in a large-scale public health program.
50
00:02:26.729 --> 00:02:30.000
Our friend Bill Gates and Melinda Gates were behind that.
51
00:02:30.680 --> 00:02:32.840
I don't know if they're actually our friends, but we've
52
00:02:33.180 --> 00:02:40.210
seen them. Yeah, I met them. About 360,000 children per
53
00:02:40.250 --> 00:02:43.090
year were expected to receive it during the pilot. So cool.
54
00:02:44.090 --> 00:02:49.180
Ethiopia and Eritrea's peace efforts received the Nobel Peace Prize.
55
00:02:50.060 --> 00:02:50.539
Very good.
56
00:02:50.740 --> 00:02:53.599
Those two have been at loggerheads since their formations.
57
00:02:53.759 --> 00:02:54.020
Yeah.
58
00:02:54.319 --> 00:02:58.500
And see, it is possible. Nearly 100 captive whales and
59
00:02:58.659 --> 00:03:02.740
orcas were returned to the wild. Russian authorities gradually released
60
00:03:02.819 --> 00:03:06.699
animals from the notorious whale jail in the country's far east.
61
00:03:07.240 --> 00:03:10.400
By November, the remaining 50 beluga whales had been freed,
62
00:03:10.460 --> 00:03:11.939
completing the operation.
63
00:03:12.139 --> 00:03:12.319
Wow.
64
00:03:12.490 --> 00:03:18.849
Reminds me of Star Trek IV. Algeria and Argentina eliminated malaria.
65
00:03:19.189 --> 00:03:21.889
Eliminated. How cool is that? Well, there's a bunch of
66
00:03:21.909 --> 00:03:23.449
ways to tackle that, right? Like you can do it
67
00:03:23.490 --> 00:03:29.000
by just controlling mosquitoes. Yeah. But also, you know, handing
68
00:03:29.069 --> 00:03:31.300
out nets. Like there's all kinds of tools to try.
69
00:03:31.539 --> 00:03:36.020
And it all works together. Ethiopia launched a massive tree
70
00:03:36.080 --> 00:03:42.110
planting campaign. Millions participated in the country's green legacy reforestation effort.
71
00:03:42.770 --> 00:03:46.909
The Ethiopian government reported that roughly 350 million seedlings were
72
00:03:46.949 --> 00:03:49.469
planted in a single day in July, part of a
73
00:03:49.509 --> 00:03:54.389
campaign aimed at planting billions of trees. The exact single-day
74
00:03:54.509 --> 00:04:01.069
figure wasn't independently verified, but the enormous public participation was real. So,
75
00:04:01.569 --> 00:04:04.669
now let's get to the depressing stuff. Well, maybe not depressing,
76
00:04:04.710 --> 00:04:08.159
but you know. Donald Trump is impeached. For the first time.
77
00:04:08.379 --> 00:04:13.909
Depressing? It's up to you, I think. Hong Kong pro-democracy protests.
78
00:04:14.009 --> 00:04:14.669
Do not go well.
79
00:04:14.729 --> 00:04:16.089
What began as... What's that?
80
00:04:16.189 --> 00:04:17.009
Do not go well.
81
00:04:17.269 --> 00:04:17.470
No.
82
00:04:17.970 --> 00:04:21.149
What began as opposition to an extradition bill grew into
83
00:04:21.209 --> 00:04:26.889
enormous demonstrations demanding democratic reforms and resistance to Beijing's increasing influence.
84
00:04:27.600 --> 00:04:30.899
The protests continued for months and frequently resulted in violent
85
00:04:30.920 --> 00:04:38.139
clashes with the police. Brexit crisis and Boris Johnson's rise. Richard,
86
00:04:38.379 --> 00:04:41.519
do you remember we were sitting in a restaurant somewhere
87
00:04:41.540 --> 00:04:44.660
and you looked over and you said, hey, that's Boris Johnson.
88
00:04:45.199 --> 00:04:46.819
Do you remember that? It was in London.
89
00:04:46.839 --> 00:04:47.240
Yeah.
90
00:04:47.360 --> 00:04:48.480
We were at NDC London.
91
00:04:48.639 --> 00:04:48.800
Yeah.
92
00:04:48.860 --> 00:04:51.139
And you're like, that's Boris Johnson. And I said.
93
00:04:51.220 --> 00:04:51.959
He was in the restaurant.
94
00:04:52.370 --> 00:04:56.310
I said, who? Because I didn't know.
95
00:04:56.470 --> 00:04:58.629
He was the mayor of London one point. And he
96
00:04:58.649 --> 00:05:00.550
was kind of funny when he was the mayor of London.
97
00:05:00.569 --> 00:05:01.589
The quirky guy.
98
00:05:01.949 --> 00:05:05.009
I think this was before his further rise, so I
99
00:05:05.069 --> 00:05:06.069
really didn't know who he was.
100
00:05:06.110 --> 00:05:07.970
Before he was prime minister. Yeah.
101
00:05:08.069 --> 00:05:11.209
But, you know, we did see him. Theresa May repeatedly
102
00:05:11.250 --> 00:05:13.920
failed to get her Brexit agreement through parliament and resigned.
103
00:05:14.420 --> 00:05:17.720
Boris Johnson became prime minister, negotiated a revised deal, and
104
00:05:17.759 --> 00:05:24.779
then won a huge conservative majority in December. Christchurch mosque massacres.
105
00:05:25.100 --> 00:05:29.819
Bad news. This was in New Zealand, your home country.
106
00:05:30.250 --> 00:05:34.509
A white supremacist attacked two mosques in Christchurch on March 15th,
107
00:05:34.550 --> 00:05:38.009
killing 51 people. But the massacre led New Zealand to
108
00:05:38.100 --> 00:05:39.480
rapidly tighten its gun laws.
109
00:05:39.629 --> 00:05:40.319
Yeah, what a concept.
110
00:05:40.740 --> 00:05:44.860
Notre Dame Cathedral set ablaze on April 15th.
111
00:05:44.879 --> 00:05:45.639
It was an accident.
112
00:05:45.740 --> 00:05:46.019
Yeah.
113
00:05:46.579 --> 00:05:50.420
On April 15th, the world watched as the 850-year-old cathedral
114
00:05:50.480 --> 00:05:54.319
in Paris burned. Its famous spire collapsed and much of
115
00:05:54.339 --> 00:05:57.180
the medieval roof was destroyed, although firefighters managed to save
116
00:05:57.199 --> 00:06:00.990
the main structure. And many important artworks and relics. And
117
00:06:01.410 --> 00:06:03.769
they rebuilt it. It is rebuilt now, yeah. I haven't
118
00:06:03.810 --> 00:06:05.660
seen the new one, but it's on my list. And
119
00:06:05.680 --> 00:06:08.699
you can still see the guy in the tower.
120
00:06:08.480 --> 00:06:09.360
Going, yes, master.
121
00:06:09.379 --> 00:06:19.709
Boeing 737 MAX crashes in worldwide grounding. Was this the
122
00:06:19.750 --> 00:06:21.050
beginning of the end for Boeing?
123
00:06:21.750 --> 00:06:24.110
Oh, no. This was towards the end of the end.
124
00:06:24.129 --> 00:06:25.389
Towards the end of the end.
125
00:06:26.230 --> 00:06:27.670
When you get to the point of actually building an
126
00:06:27.790 --> 00:06:30.509
unsafe aircraft and ignoring the fact that your engineers are
127
00:06:30.529 --> 00:06:32.670
telling you it's unsafe until it starts killing people, you
128
00:06:32.750 --> 00:06:33.649
are very lost.
129
00:06:34.000 --> 00:06:38.420
Yeah. Just a couple more. The U.S.-China trade war escalates.
130
00:06:39.959 --> 00:06:46.420
ISIS leader Abu Bakr al-Baghdadi killed. Mass shootings in El
131
00:06:46.480 --> 00:06:53.100
Paso and Dayton, Ohio. And worldwide protest movements erupt. Beyond
132
00:06:53.139 --> 00:07:02.509
Hong Kong, 2019 saw enormous anti-government demonstrations in Chile, Lebanon, Iraq, Algeria, Sudan, Iran, Bolivia,
133
00:07:02.649 --> 00:07:07.329
and Haiti, among others. So, people not happy.
134
00:07:07.790 --> 00:07:08.730
No. Yeah.
135
00:07:09.069 --> 00:07:11.269
You done? Yeah, I guess I'm done. Let me give
136
00:07:11.290 --> 00:07:12.350
you one more grim one.
137
00:07:12.370 --> 00:07:12.870
Okay.
138
00:07:13.069 --> 00:07:16.139
Right at the end of December 2019, authorities in Wuhan,
139
00:07:16.160 --> 00:07:18.120
China report an unusual pneumonia.
140
00:07:18.670 --> 00:07:19.350
Interesting.
141
00:07:19.379 --> 00:07:19.649
Yeah.
142
00:07:19.790 --> 00:07:21.129
That might have been COVID.
143
00:07:21.350 --> 00:07:21.990
Might have been. Yeah.
144
00:07:22.790 --> 00:07:24.910
Yeah, because that's when.
145
00:07:24.829 --> 00:07:27.389
It really started. All right. You ready for some space stuff? Sure.
146
00:07:27.410 --> 00:07:30.290
Go for it. January, the New Horizons spacecraft, the one
147
00:07:30.310 --> 00:07:34.529
that had gone to Pluto, still going, had its next
148
00:07:34.680 --> 00:07:37.720
close flyby to a Kuiper belt object. Today, we call
149
00:07:37.740 --> 00:07:40.699
that Kuiper belt object Arrokoth, although at the time they
150
00:07:40.720 --> 00:07:44.180
called it Ultima Thule. So that's over a billion kilometers
151
00:07:44.279 --> 00:07:47.579
beyond Pluto. That's how fast that thing was moving. And
152
00:07:47.600 --> 00:07:51.100
was basically a primordial solar system object. It was literally
153
00:07:51.220 --> 00:07:54.339
two blobs of rock and ice stuck together in a
154
00:07:54.399 --> 00:07:58.160
very low gravitational space. But, you know, just an extraordinary
155
00:07:58.240 --> 00:08:01.620
scene back to the early history of the solar system
156
00:08:01.689 --> 00:08:05.329
that way. That's 2019. It's been seven more years. New
157
00:08:05.350 --> 00:08:09.329
Horizons is still whizzing out at very high speed. Also
158
00:08:09.389 --> 00:08:13.209
in January, China's Chang'e 4 lander lands on the far
159
00:08:13.269 --> 00:08:15.930
side of the moon. First time ever in the Von
160
00:08:15.970 --> 00:08:21.810
Karman crater. It has the U-2-2 rover on board. I
161
00:08:21.860 --> 00:08:25.000
think that means little rabbit. It will start its exploration
162
00:08:25.040 --> 00:08:29.000
in the previous year. China had also put up their
163
00:08:29.060 --> 00:08:31.310
relay satellite so they could communicate to the far side
164
00:08:31.350 --> 00:08:34.690
of the moon. In February, back on Mars, the Opportunity
165
00:08:34.750 --> 00:08:38.250
Rover finally ends its mission after 15 years. Designed about
166
00:08:38.269 --> 00:08:40.169
the size of a golf cart, designed for operations for
167
00:08:40.169 --> 00:08:45.460
90 days, ran for 15 years. Now, in 2019, it
168
00:08:45.500 --> 00:08:50.320
was when it declared its mission over. Its last communication
169
00:08:50.340 --> 00:08:54.710
was actually in 2018. There had been a major dust
170
00:08:54.750 --> 00:08:57.889
storm in 2018 on Mars. And that was always the
171
00:08:57.929 --> 00:09:00.590
challenge with these rovers is that there was spirit and opportunities.
172
00:09:00.629 --> 00:09:03.330
They are all solar-based, and so the dust covers up
173
00:09:03.350 --> 00:09:07.389
the solar panels. But the atmosphere of Mars occasionally would
174
00:09:07.450 --> 00:09:11.830
create dust levels that would clean those solar panels off. Classically,
175
00:09:13.549 --> 00:09:16.360
at that time, Opportunity had its own Twitter account, and
176
00:09:16.440 --> 00:09:18.820
so the operators would take the telemetry data and turn
177
00:09:18.840 --> 00:09:22.600
it into text as a tweet from Opportunity. And so
178
00:09:22.620 --> 00:09:26.240
Opportunity's last tweet was, my battery's getting low, and it's
179
00:09:26.279 --> 00:09:28.940
getting dark. Of course, the reality for a device like
180
00:09:28.960 --> 00:09:31.279
that is that if it doesn't have enough power to
181
00:09:31.360 --> 00:09:34.679
keep its electronics warm overnight, those will freeze and it
182
00:09:34.720 --> 00:09:36.960
will not power back up. And that's what happened to Opportunity. Bummer.
183
00:09:37.139 --> 00:09:40.840
In March, the Crew Dragon by SpaceX does its first
184
00:09:41.159 --> 00:09:44.210
flight to the International Space Station. It's completely autonomous. It
185
00:09:44.269 --> 00:09:46.470
actually does its own docking. There's nobody on board. It
186
00:09:46.570 --> 00:09:51.389
works perfectly. It then leaves the station and de-orbits and
187
00:09:51.549 --> 00:09:54.830
lands in the ocean and is recovered successfully. All good news.
188
00:09:55.830 --> 00:09:58.700
Here's the bad news. The following month, that same capsule
189
00:09:58.879 --> 00:10:01.779
is now having an abortion. system test. This was an
190
00:10:01.840 --> 00:10:04.580
unmanned test tethered to the ground firing the Super Dracos
191
00:10:05.100 --> 00:10:08.710
and something goes terribly wrong and the vehicle is destroyed
192
00:10:08.730 --> 00:10:11.870
in the explosion. Bummer. There was a leak in the
193
00:10:11.909 --> 00:10:16.690
helium system for the Super Dracos that created a mass detonation.
194
00:10:17.070 --> 00:10:19.210
NASA actually considered it lucky. It was a huge gift.
195
00:10:19.960 --> 00:10:22.639
You know, you'd hate to have that occur during an
196
00:10:22.759 --> 00:10:27.419
actual flight. It'll delay things for the rest of the year.
197
00:10:27.460 --> 00:10:29.559
They won't flag it until 2020, although that will actually
198
00:10:29.580 --> 00:10:33.470
deliver crew successfully. They'll do a new abort system, use tests,
199
00:10:33.590 --> 00:10:37.769
including an in-flight unmanned abort. Also in April, also on Mars,
200
00:10:37.809 --> 00:10:40.549
the InSight lander will get its first telemetry by measuring
201
00:10:40.590 --> 00:10:43.149
a Mars quake to start mapping the interior of Mars.
202
00:10:43.850 --> 00:10:47.620
So opportunity's done, but the InSight lander's doing its thing. Uh,
203
00:10:47.820 --> 00:10:52.299
also in April, the Israeli nonprofit, uh, company space IL
204
00:10:52.340 --> 00:10:56.279
launched the bear sheet lander, the first commercial privately funded
205
00:10:56.340 --> 00:10:59.440
lunar lander ever flies on a Falcon nine. It originally
206
00:10:59.460 --> 00:11:02.200
been part of the lunar X prize, which started back
207
00:11:02.240 --> 00:11:05.360
in 2017 and 2007 and had ended in 2018. So
208
00:11:05.440 --> 00:11:08.759
it was actually over. It did make it to the moon,
209
00:11:08.820 --> 00:11:12.000
but failed on its landing, which is not that unusual, uh,
210
00:11:12.039 --> 00:11:13.830
because it's really hard to land on the moon. In fact,
211
00:11:14.330 --> 00:11:16.570
Later in the year, in July, India will launch their
212
00:11:16.610 --> 00:11:19.230
Chandran-2 to the moon, and their orbital will work perfectly,
213
00:11:19.250 --> 00:11:22.529
but their Vikram lander will crash on its descent towards
214
00:11:22.570 --> 00:11:28.049
the South Pole. Also in April, the Event Horizon Telescope
215
00:11:28.100 --> 00:11:31.159
publishes the first image of a black hole in the
216
00:11:31.200 --> 00:11:34.960
center of the galaxy, Messier 87. I remember. So this
217
00:11:35.039 --> 00:11:38.500
is using a technology called very long baseline infrometry, where
218
00:11:38.519 --> 00:11:41.879
they actually harness data from a dozen or so different
219
00:11:41.919 --> 00:11:44.750
radio telescopes around the world. to create a sort of
220
00:11:44.909 --> 00:11:48.269
super radio telescope. And then they composite the image into
221
00:11:48.309 --> 00:11:51.080
what they, um, black hole look like. And it turned
222
00:11:51.129 --> 00:11:55.139
out looked exactly like the one in interstellar, uh, which, which, uh,
223
00:11:55.220 --> 00:11:57.179
there's a good reason for that. Uh, Christopher Nolan hired
224
00:11:57.200 --> 00:12:01.009
a Caltech physicist named Kim Thorne, who actually figured out
225
00:12:01.070 --> 00:12:04.259
what it should look like. And, uh, the, EHT actually
226
00:12:04.299 --> 00:12:04.960
validated that.
227
00:12:05.120 --> 00:12:07.659
And it was very low resolution, if I remember correctly.
228
00:12:07.759 --> 00:12:10.259
Of course. But, you know, you're literally talking billions of
229
00:12:10.299 --> 00:12:12.620
light years away. So it's a miracle it works at all.
230
00:12:12.639 --> 00:12:15.840
But it's just, you know, we're getting new superpowers. In May,
231
00:12:15.860 --> 00:12:19.519
SpaceX launches the very first batch of Starlink satellites, an
232
00:12:19.559 --> 00:12:23.850
array of 60. Yeah. In August, SpaceX does their first
233
00:12:23.879 --> 00:12:27.230
flight of Starhopper. This was a funny little looking can
234
00:12:27.269 --> 00:12:29.590
of a thing with some legs on it. Flew just
235
00:12:29.629 --> 00:12:33.309
a short distance and landed again. It's the beginning of Starship,
236
00:12:33.500 --> 00:12:35.580
but the really important thing is this is their new
237
00:12:35.679 --> 00:12:39.679
Raptor engine, a methane liquid oxygen engine. And it's also
238
00:12:39.759 --> 00:12:41.620
full flow combustion. So that was the first time that
239
00:12:41.659 --> 00:12:44.840
a full flow combustion stage combustion engine had ever flown.
240
00:12:45.399 --> 00:12:47.889
And it'll get bigger for that. And one little piece
241
00:12:47.929 --> 00:12:51.809
of additional Boeing news alongside killing people in their dangerous 737,
242
00:12:51.809 --> 00:12:53.049
which admittedly is now fixed.
243
00:12:53.090 --> 00:12:53.309
Yeah.
244
00:12:53.370 --> 00:12:56.149
And I have flown on it. Uh, Boeing flies their
245
00:12:56.190 --> 00:12:58.570
Starliner to the International Space Station for the first time,
246
00:12:58.649 --> 00:13:00.190
except for that part where it never got to the
247
00:13:00.230 --> 00:13:00.889
space station.
248
00:13:01.190 --> 00:13:01.529
Right.
249
00:13:02.529 --> 00:13:07.529
Software bugs in the system cause the vehicle to decide
250
00:13:07.580 --> 00:13:09.799
that it's actually farther along the mission than it actually is.
251
00:13:09.860 --> 00:13:13.580
And it tries to correct its orientation inappropriately. And before
252
00:13:13.600 --> 00:13:16.039
they can send commands to get it to stop doing that,
253
00:13:16.500 --> 00:13:18.980
it burns up so much of its maneuvering fuel. That
254
00:13:19.000 --> 00:13:20.620
it's unable to make it to the space station. They
255
00:13:20.679 --> 00:13:23.419
do get control of it, fix the problem with the
256
00:13:23.460 --> 00:13:27.710
software and successfully de-orbit and recover the vehicle. But that
257
00:13:27.730 --> 00:13:29.490
will only be the beginning of a whole series of
258
00:13:29.529 --> 00:13:32.909
terrible problems for Starliner that are not resolved to this day.
259
00:13:33.190 --> 00:13:36.230
Hey, when you mentioned Starlink, you were using Starlink, right?
260
00:13:36.450 --> 00:13:37.070
Are you using it now?
261
00:13:37.269 --> 00:13:40.149
I wasn't at that point. It would be later. I
262
00:13:40.169 --> 00:13:42.090
would apply for the beta and get into the beta
263
00:13:42.269 --> 00:13:43.909
in a couple of years after that. But are you
264
00:13:43.929 --> 00:13:47.549
using it right now? I'm not right now, no. It's
265
00:13:47.600 --> 00:13:49.940
my backup. I have fiber now to this house in
266
00:13:49.960 --> 00:13:52.820
the middle of nowhere, which is ridiculous. It is ridiculous.
267
00:13:52.840 --> 00:13:56.360
Starlink is the backup. Okay, onto the computing side of things.
268
00:13:56.460 --> 00:13:59.940
A whole bunch of stories around OpenAI. So February of
269
00:13:59.940 --> 00:14:04.940
2019 is the release of GPT-2. And remember that the
270
00:14:05.340 --> 00:14:07.649
mantra of OpenAI had been to do AI out in
271
00:14:07.659 --> 00:14:09.690
the open, do it also open source, right? That's why
272
00:14:09.710 --> 00:14:13.350
it's called OpenAI. But they come to the conclusion that
273
00:14:13.370 --> 00:14:16.809
their largest model in GPT-2, which was a 1.5 billion
274
00:14:16.830 --> 00:14:20.379
parameter model, oh, how quaint, is too powerful and that
275
00:14:20.389 --> 00:14:22.460
it shouldn't be shared publicly. So they only release a
276
00:14:22.480 --> 00:14:26.000
very tiny version of it just to show its potential.
277
00:14:26.740 --> 00:14:29.019
And they are starting to reconsider what the company's all about.
278
00:14:29.720 --> 00:14:31.860
Part of this is they're working on a paper, which
279
00:14:31.879 --> 00:14:36.700
they'll publish in 2020, about... the scale necessary to build
280
00:14:36.720 --> 00:14:39.639
these language models and that being a not-for-profit is just
281
00:14:39.679 --> 00:14:42.240
not feasible. It's not the way they're going to be successful.
282
00:14:42.620 --> 00:14:44.909
And so in March, they'll restructure OpenAI to become what
283
00:14:44.929 --> 00:14:48.009
they call a capped profit company, which is funny because
284
00:14:48.029 --> 00:14:49.830
this is all around the time that likely they're talking
285
00:14:49.870 --> 00:14:54.269
to Microsoft because in June, Kevin Scott wrote an email
286
00:14:54.370 --> 00:14:58.679
to Bill Gates and Satya Nadella called Thoughts on OpenAI.
287
00:14:59.490 --> 00:15:02.190
where he talked about the fact that OpenAI and DeepMind
288
00:15:02.210 --> 00:15:05.110
and Google Brain were well ahead of Microsoft and that
289
00:15:05.129 --> 00:15:09.490
there was an opportunity to invest in OpenAI and put
290
00:15:09.509 --> 00:15:12.169
them over onto Azure and maybe have a relationship. That,
291
00:15:12.210 --> 00:15:15.379
of course, will happen in July. Sam Altman and Nadella
292
00:15:15.389 --> 00:15:19.659
will be on stage together. We'll announce an exclusive cloud partnership.
293
00:15:19.720 --> 00:15:20.539
I do remember that.
294
00:15:20.879 --> 00:15:23.740
And finally, in December, Microsoft will put a billion dollars
295
00:15:23.879 --> 00:15:27.460
into OpenAI, although how much of that they'll spend buying Azure,
296
00:15:27.480 --> 00:15:31.340
we don't really know. Related to one of your stories
297
00:15:31.399 --> 00:15:35.500
early on about China, in March, the UK publishes a
298
00:15:35.539 --> 00:15:41.429
report about Huawei, concerns about Chinese security with kill switches
299
00:15:41.549 --> 00:15:45.049
on 5G networking and things like that. The UK has
300
00:15:45.110 --> 00:15:48.169
a group that's actually getting into the software that drives
301
00:15:48.230 --> 00:15:50.629
all of those things, but they consider the software such
302
00:15:50.720 --> 00:15:54.179
poor quality that they can't even verify its reliability or
303
00:15:54.220 --> 00:15:59.559
security and consider it unsafe to use. That will result
304
00:15:59.580 --> 00:16:03.360
in May, the Trump administration will literally say, you can't
305
00:16:03.580 --> 00:16:06.899
use Huawei stuff, full stop. And it'll spread around all
306
00:16:06.919 --> 00:16:09.419
of the Western world, really. That's around the time the
307
00:16:09.460 --> 00:16:12.370
first 5G networks actually get deployed in the US, in April.
308
00:16:13.429 --> 00:16:16.450
Also in April, but on April 2nd, not April 1st,
309
00:16:16.669 --> 00:16:21.129
probably deliberately, Google shuts down, Google +. Can't do that
310
00:16:21.169 --> 00:16:26.700
on April 2nd, it's not funny. Okay, September, Visual Studio 2019.
311
00:16:26.700 --> 00:16:31.470
with Framework 4.8, but also. NET Core 3.0, which is
312
00:16:31.529 --> 00:16:34.379
really the point where you kind of hit parity, so
313
00:16:34.409 --> 00:16:37.519
the features, In the old framework that we wanted in
314
00:16:37.539 --> 00:16:39.799
the open source cloud platform version, they were all there
315
00:16:39.879 --> 00:16:41.240
now and more or less complete.
316
00:16:41.299 --> 00:16:42.519
That's where I started using it.
317
00:16:42.559 --> 00:16:42.840
Yeah.
318
00:16:42.919 --> 00:16:44.320
I started using it at three.
319
00:16:44.519 --> 00:16:46.080
Yeah, and it was the point where it's like, hey,
320
00:16:46.100 --> 00:16:48.000
this is the end of the road. There won't be a.
321
00:16:48.139 --> 00:16:50.299
NET Core 4. There won't be two versions of. NET
322
00:16:50.350 --> 00:16:52.470
after this. There'll just be five, although you know the
323
00:16:52.509 --> 00:16:56.210
old framework, 4.8 will never go anymore. And in December,
324
00:16:56.230 --> 00:16:59.669
they'll put out 3.1, fixing some of the problems. Two
325
00:16:59.690 --> 00:17:04.309
more stories. October. Google's Sycamore processor. So the first real
326
00:17:04.430 --> 00:17:09.130
public demonstration of what we would call quantum supremacy. This
327
00:17:09.190 --> 00:17:12.170
was one of those chandeliers soaked in liquid helium style
328
00:17:12.230 --> 00:17:15.259
quantum computers, very fragile. It had 54 qubits, only 53
329
00:17:15.259 --> 00:17:19.220
of them were functioning, did a 200 second run doing
330
00:17:19.259 --> 00:17:23.180
a random number sampling task. Google argued that this would
331
00:17:23.200 --> 00:17:25.819
take 10,000 years with a traditional computer and they finished
332
00:17:25.839 --> 00:17:28.619
it in 200 seconds. IBM, of course, challenged the numbers
333
00:17:28.640 --> 00:17:32.519
and then demonstrated various strata on quantum strategies to get
334
00:17:32.619 --> 00:17:34.650
pretty good results. I think they're fastest when they got
335
00:17:34.670 --> 00:17:39.130
it down to a couple of days, but whatever. But
336
00:17:39.170 --> 00:17:42.980
it is in a wave of advancement in quantum computing.
337
00:17:43.559 --> 00:17:45.160
And last but not least, because I do think it
338
00:17:45.220 --> 00:17:47.799
impacts a lot of the conversations we're having today in
339
00:17:47.819 --> 00:17:54.180
December at Amazon's reInvent conference, They talk about Graviton2, which
340
00:17:54.240 --> 00:17:59.519
was custom ARM processors for workloads in EC2. They're promising
341
00:17:59.519 --> 00:18:02.519
40% better price performance. Up until this point, for the
342
00:18:02.579 --> 00:18:07.809
most part, the cloud had been regular machines bought with
343
00:18:07.890 --> 00:18:10.109
Intel and AMD chips and so forth, bought by the
344
00:18:10.150 --> 00:18:12.910
big vendors, already pre-racked and so forth. But now the
345
00:18:12.930 --> 00:18:15.910
cloud companies, Amazon being one, but also Microsoft and Google
346
00:18:15.930 --> 00:18:18.319
as well. Google was already going into their TensorFlows and
347
00:18:18.339 --> 00:18:21.450
things like that. Are starting to build their own hardware
348
00:18:21.470 --> 00:18:24.349
to optimize for cloud workloads. And that's going to change
349
00:18:24.410 --> 00:18:25.329
things going forward.
350
00:18:25.529 --> 00:18:25.769
Yeah.
351
00:18:25.970 --> 00:18:26.950
Those are my stories, friend.
352
00:18:27.170 --> 00:18:30.740
All right. Well, that brings us to better know a framework.
353
00:18:30.859 --> 00:18:31.339
Awesome.
354
00:18:31.660 --> 00:18:33.819
Or something. Better Know Something, maybe we should call it.
355
00:18:33.829 --> 00:18:35.009
Better Know Something.
356
00:18:35.250 --> 00:18:36.369
That would have been a great title.
357
00:18:37.410 --> 00:18:47.670
All right, man, what do you got? Okay, so for
358
00:18:47.710 --> 00:18:51.170
those of you paying attention to my other shows, Rocky
359
00:18:51.210 --> 00:18:55.180
Latka and I started with him as co-host on Code
360
00:18:55.200 --> 00:18:59.180
It With AI, which is presented by DevExpress.
361
00:19:00.180 --> 00:19:00.480
And we....
362
00:19:02.000 --> 00:19:08.200
Just put Quen 3.8 local to the test. Quen 3.8
363
00:19:08.200 --> 00:19:11.380
is a model, and I ran it on Ollama. And
364
00:19:11.779 --> 00:19:15.200
we had done on episodes 29 and 30 with Jeff Fritz,
365
00:19:15.740 --> 00:19:20.420
we had done comparisons between local models running in this
366
00:19:20.519 --> 00:19:22.480
hardware that I have, right, in Ollama.
367
00:19:22.859 --> 00:19:23.019
Yeah.
368
00:19:23.240 --> 00:19:26.869
And Quen 3.6 was the winner by far. So I
369
00:19:27.029 --> 00:19:28.890
was thinking Quen 3.8, going to be great.
370
00:19:30.269 --> 00:19:30.509
Yeah.
371
00:19:31.269 --> 00:19:43.950
Not so much. Interesting. because Alama allocates context depending on
372
00:19:43.970 --> 00:19:46.420
the amount of VRAM you have.
373
00:19:47.599 --> 00:19:52.420
So I got 30, 35 or 32, 32 K based
374
00:19:52.480 --> 00:19:54.259
on the amount of VRAM that I had, but I
375
00:19:54.279 --> 00:19:57.440
don't think it was enough because it was, it was
376
00:19:57.849 --> 00:20:01.029
doing the confusing things that the other models had done earlier,
377
00:20:01.329 --> 00:20:04.569
which is telling you that it, you know, couldn't reach
378
00:20:04.589 --> 00:20:10.569
the API, giving you some weird nil error, and stopping.
379
00:20:11.809 --> 00:20:18.650
So Rocky tells me about llama.cpp. And llama.cpp is an
380
00:20:18.710 --> 00:20:24.250
alternative to Ollama that it allows you to host models.
381
00:20:24.329 --> 00:20:27.430
But the cool thing about it is that it can
382
00:20:27.490 --> 00:20:30.890
take the compute heavy stuff and run that in VRAM.
383
00:20:31.309 --> 00:20:33.470
And then it can use your system RAM for the
384
00:20:33.509 --> 00:20:35.299
rest of it. Now, I don't know if it swaps
385
00:20:35.359 --> 00:20:39.309
things in and out, system RAM, VRAM, or it just
386
00:20:39.549 --> 00:20:42.990
runs some things that don't require such a heavy load
387
00:20:45.490 --> 00:20:49.609
in system RAM, but that's it. So then there are
388
00:20:49.650 --> 00:20:52.630
only certain models that can run, but there's a QEN
389
00:20:52.670 --> 00:20:57.279
model that runs that's bigger that I'm going to try
390
00:20:57.359 --> 00:21:01.160
for next week's Code with AI. Well, I say next week.
391
00:21:01.859 --> 00:21:07.940
We're recording this on August 21st. or 20th, rather.
392
00:21:09.500 --> 00:21:09.900
I'm sorry.
393
00:21:10.299 --> 00:21:15.640
We're recording this on August 21st, and it won't come
394
00:21:15.680 --> 00:21:20.700
out until September 10th. So the episode would be 43,
395
00:21:20.700 --> 00:21:25.309
and that would be on last week, September 2nd. So
396
00:21:25.329 --> 00:21:27.140
if you want to see what that does, I'm going
397
00:21:27.160 --> 00:21:29.130
to have a live demo of it. I'm going to
398
00:21:29.150 --> 00:21:32.269
try it, but llama.cpp. Know it, learn it, love it.
399
00:21:32.829 --> 00:21:34.029
Who's talking to us today, Richard?
400
00:21:34.490 --> 00:21:37.130
I had to go back. We're doing mathematics today, so
401
00:21:37.150 --> 00:21:38.509
I had to go back to a mathematics show. So,
402
00:21:38.529 --> 00:21:41.990
I went way back. 1252, which is from 2016. Our
403
00:21:42.019 --> 00:21:48.940
friend Seth Juarez talking about his library, NUML. Because secretly,
404
00:21:49.460 --> 00:21:51.599
Seth Juarez, as charming and entertaining as he was on
405
00:21:51.640 --> 00:21:54.609
Channel 9, actually a maths guy. Got a real, you know,
406
00:21:54.619 --> 00:21:58.009
got a master's degree. Super smart, you know. Great at
407
00:21:58.049 --> 00:21:59.470
explaining the whole.
408
00:21:59.769 --> 00:22:00.029
Oh, yeah.
409
00:22:00.650 --> 00:22:02.650
LLM wave too. We've done some cool shows with it.
410
00:22:03.269 --> 00:22:06.789
So this is a comment from, uh, Kirian O'Neill, who
411
00:22:06.829 --> 00:22:09.839
says another scheduling library along the lines of courts.net. We
412
00:22:09.880 --> 00:22:12.460
were talking about that library as well. Worth mentioning is
413
00:22:12.599 --> 00:22:15.839
hang fire. The advantage I've gained from using hang fires
414
00:22:15.880 --> 00:22:18.180
that it runs in process. It doesn't require a separate
415
00:22:18.240 --> 00:22:20.849
window service. And depending on your use cases can be
416
00:22:20.869 --> 00:22:23.279
a big advantage. And it's one less thing to think
417
00:22:23.339 --> 00:22:26.740
about when deploying because, yeah, pushing out stuff to count
418
00:22:26.779 --> 00:22:29.880
on Windows services and stuff is ugly if you're going
419
00:22:29.900 --> 00:22:31.720
to try and make things work properly for you. But,
420
00:22:32.299 --> 00:22:33.960
you know, this was a whole conversation we had with
421
00:22:34.009 --> 00:22:36.930
Seth about how you do these long compute workloads when
422
00:22:36.950 --> 00:22:39.150
you're working out things like machine learning models and so
423
00:22:39.190 --> 00:22:41.009
forth where they may run for a couple of days.
424
00:22:41.630 --> 00:22:43.450
And you don't want to just tie up the whole machine.
425
00:22:43.490 --> 00:22:45.630
You want to run them in the background. Yep. So, Kirian,
426
00:22:45.650 --> 00:22:47.450
thank you so much for your comment. And a copy
427
00:22:47.470 --> 00:22:48.849
of Music to Code By is on its way to you.
428
00:22:48.869 --> 00:22:50.430
And if you'd like a copy of Music to Code By,
429
00:22:50.450 --> 00:22:53.460
write a comment on the website at. netrocks. com or on
430
00:22:53.480 --> 00:22:55.019
the Facebooks. We publish every show there. And if you
431
00:22:55.059 --> 00:22:56.640
comment there and I read it in the show, we'll
432
00:22:56.660 --> 00:22:57.740
send you a copy of Music to Code By.
433
00:22:57.819 --> 00:22:59.180
And if you want to just go get Music to
434
00:22:59.200 --> 00:23:01.099
Code By, it's at musictocodeby.net.
435
00:23:01.980 --> 00:23:02.180
All right.
436
00:23:02.200 --> 00:23:05.160
We've taken up so much time with this intro stuff.
437
00:23:05.299 --> 00:23:07.099
I think we ought to take our break now so
438
00:23:07.119 --> 00:23:11.039
we can have an uninterrupted talk with Jeffrey Sachs. So
439
00:23:11.059 --> 00:23:17.369
we'll be right back after these very important messages. And
440
00:23:17.390 --> 00:23:21.109
we're back. It's. NET Rocks. I'm Carl Franklin. That's Richard Campbell.
441
00:23:21.349 --> 00:23:21.529
Hey.
442
00:23:21.789 --> 00:23:24.309
And also here with us is Jeffrey Sachs.
443
00:23:24.430 --> 00:23:25.250
Hi. Hi.
444
00:23:26.109 --> 00:23:30.279
Jeffrey Sachs is the founder and sole developer of Numerics.net,
445
00:23:30.910 --> 00:23:32.980
a set of numerical computing libraries for.
446
00:23:33.200 --> 00:23:33.359
NET.
447
00:23:34.059 --> 00:23:37.480
He has been building the library since 2005 when the
448
00:23:37.539 --> 00:23:42.130
first version was released for. NET 1.1. Over the years, Numerics.net
449
00:23:42.170 --> 00:23:46.089
has been used for applications ranging from calculating radiation doses
450
00:23:46.170 --> 00:23:50.650
for cancer treatment and developing truck braking systems to building
451
00:23:50.690 --> 00:23:56.319
support software for atomic force microscopes. Jeffrey's work on numerical
452
00:23:56.380 --> 00:23:57.680
software predates.
453
00:23:57.960 --> 00:23:58.160
NET.
454
00:23:58.380 --> 00:23:59.619
Jeffrey, welcome.
455
00:23:59.859 --> 00:24:00.119
Hi.
456
00:24:00.779 --> 00:24:02.180
Thank you. Thanks for having me.
457
00:24:02.460 --> 00:24:03.029
You're welcome.
458
00:24:03.490 --> 00:24:07.200
Sorry about the long intro. If you're okay with it,
459
00:24:07.230 --> 00:24:10.299
we can go a little longer today. But my first
460
00:24:10.359 --> 00:24:14.259
question is, what is numerical computing?
461
00:24:14.740 --> 00:24:19.799
I would say numerical computing is the task of computing
462
00:24:19.859 --> 00:24:28.150
values to a requested accuracy with limited precision. And do
463
00:24:28.190 --> 00:24:30.210
that as fast as possible.
464
00:24:30.450 --> 00:24:36.410
So it's basically just math equations in code. Essentially, like
465
00:24:36.549 --> 00:24:39.150
a MATLAB kind of thing?
466
00:24:39.730 --> 00:24:41.069
Yeah, that's what it comes down to.
467
00:24:41.309 --> 00:24:42.730
Simulink, yeah.
468
00:24:43.019 --> 00:24:45.799
So this is outside the spectrum of what the built-in
469
00:24:45.839 --> 00:24:50.220
mathematical functions in. NET could do?
470
00:24:50.579 --> 00:24:52.119
Yes, way beyond, actually.
471
00:24:52.319 --> 00:24:52.579
Right.
472
00:24:54.319 --> 00:24:59.589
Vectors, matrices, probability, and statistics, all kinds of fun stuff.
473
00:24:59.769 --> 00:25:01.789
So it's all based on the fundamental stuff that's in
474
00:25:01.809 --> 00:25:04.970
the framework, but then you do these... abstractions on top
475
00:25:05.029 --> 00:25:07.269
of it that give you the higher level.
476
00:25:08.289 --> 00:25:08.710
That's right.
477
00:25:09.230 --> 00:25:10.710
Yeah, constructs.
478
00:25:10.990 --> 00:25:13.119
All right, let's dust off our math chop, see if
479
00:25:13.130 --> 00:25:19.019
we remember any of this stuff from school. Holy man. So,
480
00:25:19.140 --> 00:25:20.940
I mean, just in your comment alone, you were talking
481
00:25:20.960 --> 00:25:23.680
about things like radiation doses. So, can you talk a
482
00:25:23.680 --> 00:25:26.240
bit about what kind of math we need there? It's
483
00:25:26.279 --> 00:25:27.500
a great thing to figure out.
484
00:25:27.799 --> 00:25:28.680
Actually, I'm not sure.
485
00:25:28.700 --> 00:25:29.140
I just.
486
00:25:29.740 --> 00:25:31.339
hear a lot of stories from customers.
487
00:25:31.759 --> 00:25:32.119
Oh, right.
488
00:25:32.460 --> 00:25:35.019
Um, these are just your customers doing cool things with
489
00:25:35.059 --> 00:25:35.720
your software.
490
00:25:35.880 --> 00:25:36.140
Yeah.
491
00:25:36.619 --> 00:25:38.440
So that's the most fun part of what I do.
492
00:25:38.519 --> 00:25:39.940
I hear all sorts of things.
493
00:25:40.160 --> 00:25:40.789
Yeah. Yeah.
494
00:25:41.210 --> 00:25:43.190
Um, and you heard some variety of what I hear.
495
00:25:43.430 --> 00:25:45.509
Your background is in mathematics then?
496
00:25:45.650 --> 00:25:47.950
Yes, it is. I actually, right.
497
00:25:48.190 --> 00:25:49.990
So you just take him what you've learned and said like,
498
00:25:50.089 --> 00:25:52.190
how could I do these things in.net?
499
00:25:52.539 --> 00:25:55.799
Yes. I, I've been doing this pretty much my whole
500
00:25:55.839 --> 00:25:58.259
life ever since I got my hands on the computer.
501
00:25:59.000 --> 00:26:02.329
Um, And then went to university.
502
00:26:02.890 --> 00:26:06.339
Got a degree in computing science, so specializing in the
503
00:26:06.440 --> 00:26:07.220
numerical stuff.
504
00:26:07.660 --> 00:26:08.259
And then.
505
00:26:09.900 --> 00:26:13.339
After some time of building things privately, like just for
506
00:26:13.380 --> 00:26:16.940
my own enjoyment, I thought, well, why not turn this
507
00:26:17.019 --> 00:26:21.079
into my job and do it professionally?
508
00:26:21.460 --> 00:26:21.680
Wow.
509
00:26:21.880 --> 00:26:23.890
And that's how Numerics.net got started.
510
00:26:24.269 --> 00:26:24.450
Wow.
511
00:26:24.940 --> 00:26:28.119
You remind me of a product that when I was
512
00:26:28.160 --> 00:26:31.460
at Crescent Software, we sold. I didn't write it. I
513
00:26:32.130 --> 00:26:35.730
just did tech support. But it was called QuickPack Scientific.
514
00:26:36.829 --> 00:26:41.859
And so in that was a bunch of assembly language things,
515
00:26:42.460 --> 00:26:45.759
calls that you could call from basic, from QuickBasic, Basic
516
00:26:45.759 --> 00:26:50.269
7 PDS, and even Visual Basic, that did all these
517
00:26:50.329 --> 00:26:53.349
kinds of things. And I wondered even back then, why
518
00:26:53.369 --> 00:26:55.150
do you need all this if you have the fundamentals?
519
00:26:55.210 --> 00:26:56.970
And it's kind of like, you know, why do you
520
00:26:56.990 --> 00:26:59.210
need a database if you can open and read and
521
00:26:59.230 --> 00:26:59.789
write files?
522
00:27:00.890 --> 00:27:01.650
Right?
523
00:27:02.069 --> 00:27:06.650
These are layers of abstraction that help you as a non-programmer,
524
00:27:06.950 --> 00:27:11.359
maybe a scientist that dabbles in programming, do stuff easily.
525
00:27:11.539 --> 00:27:15.099
Well, it's not just about the layers of abstraction, although
526
00:27:15.119 --> 00:27:20.289
that can be useful as well. It's also about the
527
00:27:20.329 --> 00:27:25.029
limitations that you have doing math on a computer and
528
00:27:25.109 --> 00:27:26.309
still doing things correctly.
529
00:27:26.579 --> 00:27:26.859
Yeah.
530
00:27:26.950 --> 00:27:29.319
So I said, it's, we got to dig into this
531
00:27:29.380 --> 00:27:32.420
because I think it's fascinating. What, what are the, we never,
532
00:27:32.700 --> 00:27:34.319
most of the time we don't bump into these limitations.
533
00:27:34.519 --> 00:27:35.759
What are the limitations?
534
00:27:35.980 --> 00:27:41.380
Well, the primary limitation is you can't represent every number
535
00:27:41.640 --> 00:27:43.710
from real life in a computer system.
536
00:27:43.910 --> 00:27:44.190
Right.
537
00:27:44.369 --> 00:27:44.569
Right.
538
00:27:44.710 --> 00:27:48.549
So we have, integers, and then we have what we
539
00:27:48.589 --> 00:27:52.970
call real numbers. But those are really the double precision
540
00:27:53.049 --> 00:27:55.529
floating point numbers is the official name. Right.
541
00:27:55.670 --> 00:27:58.190
Yeah. And I think the floating point's a better term
542
00:27:58.230 --> 00:28:01.009
just because it lets you know. This is only so accurate.
543
00:28:01.269 --> 00:28:01.710
Yeah.
544
00:28:01.950 --> 00:28:08.670
So the limitation is these numbers have a very specific format.
545
00:28:09.210 --> 00:28:11.309
They're an integer times a power of two.
546
00:28:12.009 --> 00:28:12.230
Right.
547
00:28:12.529 --> 00:28:15.109
And you only have a certain range to work with.
548
00:28:15.720 --> 00:28:21.039
So every calculation you do, you basically are able to
549
00:28:21.180 --> 00:28:23.039
use only those numbers. Yeah.
550
00:28:23.160 --> 00:28:24.319
And that's what makes it hard.
551
00:28:24.759 --> 00:28:28.119
Right, right. So it's the precision. And you mentioned precision
552
00:28:28.420 --> 00:28:32.710
in your definition of numerical computing, that you may want
553
00:28:33.089 --> 00:28:38.450
less or more. But I get more. Why less? Yeah.
554
00:28:38.849 --> 00:28:44.630
Well, in modern-day computing, there's a lot of talk about–
555
00:28:45.359 --> 00:28:49.440
reducing the number of bits required for LLMs and so
556
00:28:49.500 --> 00:28:53.920
forth to do their calculations and still have good results.
557
00:28:54.539 --> 00:28:58.769
So they'll sample down from the original 16 or 32
558
00:28:58.769 --> 00:29:02.309
bits down to sometimes as little as four or two
559
00:29:02.349 --> 00:29:02.910
bits even.
560
00:29:03.170 --> 00:29:03.450
Wow.
561
00:29:03.670 --> 00:29:07.670
So that's why you would use less. In general, for calculations,
562
00:29:09.569 --> 00:29:13.750
you would use the standard four or eight number formats.
563
00:29:15.150 --> 00:29:19.269
because the resources aren't as tight and the computation isn't
564
00:29:19.849 --> 00:29:20.470
as intense.
565
00:29:20.809 --> 00:29:21.450
Yeah, okay.
566
00:29:21.630 --> 00:29:24.890
And so the point being, when you use a higher precision,
567
00:29:24.950 --> 00:29:27.109
it's just going to take longer for no value.
568
00:29:27.390 --> 00:29:30.609
Yeah, but if you use too little precision, things can
569
00:29:30.650 --> 00:29:31.890
go terribly long as well.
570
00:29:32.130 --> 00:29:32.369
Right.
571
00:29:32.769 --> 00:29:37.549
There's a famous example of um an arianne 5 rocket
572
00:29:38.839 --> 00:29:40.220
in 96 i think.
573
00:29:40.099 --> 00:29:42.700
It was oh yeah they lost the first one they.
574
00:29:42.579 --> 00:29:49.140
Lost the first one because some value was um stored
575
00:29:49.339 --> 00:29:54.240
as a 16-bit value for the arianne 4 rocket the
576
00:29:54.279 --> 00:29:58.339
predecessor right and they converted down from 64 bits to
577
00:29:58.339 --> 00:30:02.809
16 got an overflow which sent their navigation system into
578
00:30:02.930 --> 00:30:06.259
some kind of error state and they had to terminate
579
00:30:06.539 --> 00:30:07.680
the launch.
580
00:30:07.900 --> 00:30:10.140
Yeah, that's a very expensive boo-boo.
581
00:30:10.220 --> 00:30:10.799
Yes, it is.
582
00:30:10.880 --> 00:30:12.640
Like billion-dollar boo-boo.
583
00:30:12.940 --> 00:30:16.440
Yeah, and so one of the things that makes it
584
00:30:16.480 --> 00:30:21.220
hard is because you have that limited set of numbers,
585
00:30:23.329 --> 00:30:26.349
whenever you do a calculation, you have to start by
586
00:30:27.190 --> 00:30:32.059
approximating the number you get from real life by a
587
00:30:32.200 --> 00:30:34.220
number that's in your set that you can work with.
588
00:30:35.480 --> 00:30:38.460
So you have to round it off and that already
589
00:30:38.720 --> 00:30:42.900
right off, right out of the gate, you start with
590
00:30:42.940 --> 00:30:48.740
an error and then errors propagate. Like every calculation you do,
591
00:30:48.759 --> 00:30:52.900
when you add two numbers, the sum of those two
592
00:30:52.940 --> 00:30:58.400
numbers may not be a floating point number again. So
593
00:30:58.420 --> 00:31:03.700
then you get additional errors And sometimes it can explode and, well,
594
00:31:04.019 --> 00:31:04.900
lead to explosions.
595
00:31:05.460 --> 00:31:07.259
Right. Quite literally.
596
00:31:07.500 --> 00:31:07.720
Yeah.
597
00:31:07.880 --> 00:31:10.559
Yeah, I remember watching that, actually. And it's like suddenly
598
00:31:10.599 --> 00:31:12.779
the engines were trying to move the rocket in ways
599
00:31:12.859 --> 00:31:14.400
it really wouldn't want to move. And then it just
600
00:31:14.420 --> 00:31:15.599
sort of broke into pieces.
601
00:31:15.839 --> 00:31:16.599
Yeah, that's right.
602
00:31:16.819 --> 00:31:19.440
I had a friend. He's gone now. But he was
603
00:31:19.740 --> 00:31:27.049
a professor of mathematics. And he called himself a philosopher
604
00:31:27.480 --> 00:31:27.940
of math.
605
00:31:28.710 --> 00:31:28.950
And I.
606
00:31:30.650 --> 00:31:34.470
Was, I guess, into things that were so abstract that
607
00:31:35.150 --> 00:31:38.150
nobody could understand them, and you had to just think
608
00:31:38.210 --> 00:31:42.089
about them completely differently. One of those things that I
609
00:31:42.150 --> 00:31:47.670
think of in that vein are imaginary numbers. What the
610
00:31:47.710 --> 00:31:49.490
hell is an imaginary number?
611
00:31:50.779 --> 00:31:51.039
Right?
612
00:31:51.410 --> 00:31:55.880
Well, an imaginary number is a trick, basically, to.
613
00:31:57.759 --> 00:32:01.859
Make... the math work. So there's.
614
00:32:03.880 --> 00:32:07.880
A theory where when you compute the roots of a
615
00:32:07.920 --> 00:32:17.839
quadratic equation, you always have two roots. If you have
616
00:32:17.859 --> 00:32:21.119
real numbers as roots, that's not always the case. But
617
00:32:21.180 --> 00:32:25.809
if you allow this extension by using the square root
618
00:32:25.920 --> 00:32:32.390
of minus one as another dimension, then you can always
619
00:32:32.430 --> 00:32:36.150
get two roots. And so there's all kinds of lovely,
620
00:32:36.190 --> 00:32:40.859
beautiful math that just falls into place perfectly when you
621
00:32:40.880 --> 00:32:41.210
do that.
622
00:32:41.690 --> 00:32:42.559
I still don't get it.
623
00:32:42.900 --> 00:32:44.700
I'm remembering enough of this stuff to realize, as soon
624
00:32:44.720 --> 00:32:46.980
as you said imaginary numbers, like square root of negative two,
625
00:32:47.500 --> 00:32:50.240
that shouldn't be possible, but there's a fix for it.
626
00:32:50.440 --> 00:32:55.119
Yeah. So it's not purely mathematical. It's actually some, like
627
00:32:55.440 --> 00:32:58.019
most of quantum physics is also expressed in quantum, in, uh,
628
00:32:58.470 --> 00:33:02.400
in terms of complex numbers. So, how real that is
629
00:33:02.460 --> 00:33:05.539
is also questionable, but that's a different discussion.
630
00:33:06.660 --> 00:33:08.819
Well, you know, God doesn't play dice with the universe.
631
00:33:10.220 --> 00:33:12.650
Would you consider yourself a philosopher of math?
632
00:33:12.869 --> 00:33:14.089
A little bit, but not too much.
633
00:33:14.569 --> 00:33:19.190
Not the philosopher king, just a philosopher. No.
634
00:33:20.890 --> 00:33:25.720
The pure math and the computer math are actually very different.
635
00:33:26.089 --> 00:33:27.329
It's a very different story.
636
00:33:27.430 --> 00:33:28.609
Oh, sure, yeah.
637
00:33:28.750 --> 00:33:33.059
You don't get into extreme abstractions that only a handful
638
00:33:33.079 --> 00:33:34.299
of people understand.
639
00:33:35.240 --> 00:33:38.299
But as I understand it, mathematics and computing in general
640
00:33:38.380 --> 00:33:41.440
has been a series of compromises based on the limitations
641
00:33:42.160 --> 00:33:43.660
of the hardware available at the time.
642
00:33:44.000 --> 00:33:44.660
Yes, that's right.
643
00:33:45.009 --> 00:33:45.589
And the language.
644
00:33:46.490 --> 00:33:52.289
Language, too. There's actually funny stories about Fortran, the first
645
00:33:52.349 --> 00:34:00.420
programming language, which has... Originally, it didn't have if statements.
646
00:34:00.640 --> 00:34:04.059
It had a conditional jump. It didn't have.
647
00:34:06.910 --> 00:34:12.449
The logical operators and the comparison operators are written out
648
00:34:12.789 --> 00:34:16.570
with dots. Dot, L, T, dot is less than. The
649
00:34:16.590 --> 00:34:21.469
reason they did that was because at the time... computers
650
00:34:21.510 --> 00:34:23.449
didn't have less than signs.
651
00:34:23.829 --> 00:34:26.530
Right. The ASCII set hadn't been done yet.
652
00:34:26.690 --> 00:34:27.130
That's right.
653
00:34:27.389 --> 00:34:27.650
Wow.
654
00:34:27.829 --> 00:34:28.670
Was it EPSIDIC?
655
00:34:29.670 --> 00:34:30.789
Even earlier.
656
00:34:30.869 --> 00:34:36.070
Another interesting thing about Fortran, white space doesn't matter at all.
657
00:34:36.349 --> 00:34:36.630
Right.
658
00:34:36.869 --> 00:34:39.170
You can put spaces anywhere in the middle of a name,
659
00:34:39.190 --> 00:34:45.030
of a variable, anywhere. The reason they did that is
660
00:34:45.110 --> 00:34:52.179
because back in the day, people wrote their programs on
661
00:34:52.300 --> 00:34:57.090
punch cards and there were punch card operators who translated
662
00:34:57.110 --> 00:35:04.809
or like who entered the text in punch cards, did
663
00:35:04.829 --> 00:35:11.139
the punching to then feed into the computers. And what
664
00:35:11.179 --> 00:35:15.099
they found was that they were very sloppy with spaces
665
00:35:15.460 --> 00:35:18.500
in the transcriptions. And so there were lots of errors
666
00:35:19.340 --> 00:35:24.539
because spaces were at the time significant. And so they
667
00:35:24.559 --> 00:35:27.440
did away with that so that their programs could actually run.
668
00:35:27.920 --> 00:35:28.719
It's a workaround.
669
00:35:28.960 --> 00:35:29.139
Yeah.
670
00:35:29.420 --> 00:35:32.900
And speaking of languages, how does JavaScript hit you for
671
00:35:32.920 --> 00:35:33.719
a math language?
672
00:35:35.599 --> 00:35:38.500
JavaScript is kind of, it's not.
673
00:35:38.519 --> 00:35:39.039
You can say it.
674
00:35:39.340 --> 00:35:39.840
It's okay.
675
00:35:40.760 --> 00:35:43.059
It's not the best language for computing.
676
00:35:43.099 --> 00:35:43.739
Yeah, right.
677
00:35:43.840 --> 00:35:46.280
The nice thing about it is that you have numbers
678
00:35:46.360 --> 00:35:49.360
and they're all the same. But that's when you do
679
00:35:49.429 --> 00:35:51.960
numerical stuff, that's also the, The problem.
680
00:35:52.219 --> 00:35:52.900
Right. Yeah.
681
00:35:53.179 --> 00:35:53.980
As we found out.
682
00:35:54.619 --> 00:35:57.300
We've talked a little bit about complex numbers so far
683
00:35:57.719 --> 00:36:01.480
in the library here. I don't know that I exactly
684
00:36:01.559 --> 00:36:05.139
understand everything when we talk about space of complex numbers. Because,
685
00:36:05.760 --> 00:36:07.699
I mean, I've always thought that not a number, you know,
686
00:36:07.719 --> 00:36:11.530
speaking of JavaScript, was such a computer thing. But is
687
00:36:11.570 --> 00:36:14.449
that something relevant in complex numbers as well?
688
00:36:14.750 --> 00:36:18.150
It's relevant in all of numerical computing.
689
00:36:18.679 --> 00:36:19.059
Oh, okay.
690
00:36:19.119 --> 00:36:21.539
So a complex number just has a real part and
691
00:36:21.559 --> 00:36:22.579
an imaginary part.
692
00:36:22.800 --> 00:36:23.019
Right.
693
00:36:23.409 --> 00:36:26.469
And once you work with those two, it's just real
694
00:36:26.510 --> 00:36:30.530
math again. There's nothing complex about it. So the same
695
00:36:31.090 --> 00:36:34.730
issues that you encounter in real numbers, you will encounter
696
00:36:34.750 --> 00:36:36.199
in complex numbers again. Right.
697
00:36:36.659 --> 00:36:40.119
And so problems like infinity and not a number, these
698
00:36:40.159 --> 00:36:41.619
are just things you have to contend with.
699
00:36:41.920 --> 00:36:42.119
Yeah.
700
00:36:42.519 --> 00:36:45.820
And that's one of the weird things. Not a number
701
00:36:46.099 --> 00:36:53.889
is a special thing. encoding in the binary floating point format.
702
00:36:54.579 --> 00:36:59.079
And they compare false. So any operation, any logical operation
703
00:36:59.739 --> 00:37:02.380
with not a number returns false, including itself.
704
00:37:03.960 --> 00:37:06.099
So not a number is also not a number.
705
00:37:06.320 --> 00:37:10.449
Well, yeah. So you have to special case all kinds
706
00:37:10.489 --> 00:37:15.510
of code to work with that to trap it. One
707
00:37:15.530 --> 00:37:18.900
of the Places where you can get not a number
708
00:37:19.219 --> 00:37:22.820
is if you try to compute the square root of
709
00:37:22.860 --> 00:37:23.559
a negative number.
710
00:37:23.880 --> 00:37:24.099
Right.
711
00:37:24.320 --> 00:37:25.800
Does that make an imaginary number?
712
00:37:26.119 --> 00:37:29.420
That would make an imaginary number, but it's outside of
713
00:37:29.519 --> 00:37:31.400
the number format. Right.
714
00:37:31.980 --> 00:37:34.780
I'm starting to feel like in this context, not a
715
00:37:34.800 --> 00:37:39.539
number is problematically like nulls are problematic, where you have
716
00:37:39.579 --> 00:37:42.619
to test for them, and they're hard to test against themselves.
717
00:37:43.460 --> 00:37:45.300
So they just have to build a set of exception
718
00:37:45.320 --> 00:37:45.980
cases around it.
719
00:37:47.159 --> 00:37:51.739
That's true, and it's more of an annoyance than anything.
720
00:37:52.320 --> 00:37:54.599
If you're careful, you won't encounter them.
721
00:37:54.940 --> 00:37:55.159
Right.
722
00:37:55.860 --> 00:38:02.780
But the other challenge is of maintaining precision. If you
723
00:38:02.800 --> 00:38:05.300
can do that, you're good. If you can't, then you
724
00:38:05.320 --> 00:38:08.849
can get things like dividing zero by zero, which is
725
00:38:08.909 --> 00:38:10.230
also not a number.
726
00:38:10.369 --> 00:38:10.949
Not a number.
727
00:38:10.969 --> 00:38:11.570
Yeah.
728
00:38:12.920 --> 00:38:15.360
That's fair. So, I mean, on one hand, I'm losing
729
00:38:15.389 --> 00:38:18.889
this library because I have a particular use case where
730
00:38:18.949 --> 00:38:22.570
I have a particular requirement for precision that perhaps doesn't
731
00:38:22.610 --> 00:38:24.519
fall into what's built into.
732
00:38:24.670 --> 00:38:24.889
NET.
733
00:38:24.969 --> 00:38:26.719
Does that make sense? Is that a reason to go
734
00:38:26.780 --> 00:38:28.079
into using the library?
735
00:38:29.380 --> 00:38:31.440
That's one possibility. We have.
736
00:38:32.800 --> 00:38:37.800
Big floats that can Do enormous ranges of numbers to
737
00:38:37.920 --> 00:38:39.550
whatever precision you want, basically.
738
00:38:39.610 --> 00:38:42.889
How big is a big float there, Jeff? A Google?
739
00:38:44.750 --> 00:38:47.769
I think the exponent is about 10 billion.
740
00:38:48.449 --> 00:38:48.570
Oh.
741
00:38:49.309 --> 00:38:51.909
And you can have like up to a couple of
742
00:38:51.929 --> 00:38:53.349
billion digits, something like that.
743
00:38:53.369 --> 00:38:54.929
So you could calculate with Googles.
744
00:38:55.590 --> 00:38:55.829
Yeah.
745
00:38:56.130 --> 00:38:56.409
Wow.
746
00:38:56.710 --> 00:39:00.389
A Google actually fits in a normal double floating boy number.
747
00:39:00.530 --> 00:39:00.869
Really?
748
00:39:01.070 --> 00:39:01.269
Wow.
749
00:39:01.329 --> 00:39:03.190
If it's 10 to the power 100. Right.
750
00:39:04.239 --> 00:39:09.679
It's not exact. Because we don't have enough bits for that. But, yeah,
751
00:39:09.760 --> 00:39:10.920
it is within the range.
752
00:39:11.500 --> 00:39:14.619
Nice. Okay. But then now when I think about, you know,
753
00:39:14.679 --> 00:39:18.750
why would I want a library like this, I immediately
754
00:39:18.769 --> 00:39:22.869
head towards calculus. Because that's hard to do without a library.
755
00:39:22.989 --> 00:39:23.369
That's right.
756
00:39:23.849 --> 00:39:29.130
Well, more generally, the reason you would go to a
757
00:39:29.190 --> 00:39:35.639
library like this, is that avoiding the loss of precision
758
00:39:36.800 --> 00:39:42.739
is a challenge. Right? So we talked about every operation
759
00:39:42.800 --> 00:39:47.900
introduces potentially another additional small error. Right. There's also something
760
00:39:47.920 --> 00:39:52.900
called catastrophic cancellations. which is you have two numbers that
761
00:39:53.000 --> 00:39:59.300
almost have the same magnitude, and you subtract them. So
762
00:39:59.539 --> 00:40:02.059
the result is very small relative to those two numbers.
763
00:40:02.280 --> 00:40:02.780
Oh, okay.
764
00:40:02.840 --> 00:40:04.889
Well, your precision will plummet.
765
00:40:05.050 --> 00:40:07.210
Yeah, and turn it to a zero when it shouldn't be.
766
00:40:07.429 --> 00:40:07.670
Yeah.
767
00:40:08.150 --> 00:40:08.889
Right, okay.
768
00:40:09.150 --> 00:40:15.030
And then you get into other things like... One of
769
00:40:15.090 --> 00:40:18.420
the biggest challenges for me that I have to be
770
00:40:18.460 --> 00:40:23.130
always aware of is... Computer math is not quite like
771
00:40:23.449 --> 00:40:28.489
regular math. So, for example, the order of operations matters.
772
00:40:30.320 --> 00:40:32.659
In normal math, when you add three numbers, it doesn't
773
00:40:32.679 --> 00:40:34.119
really matter which order you do it in.
774
00:40:34.340 --> 00:40:34.519
No.
775
00:40:34.679 --> 00:40:39.300
But say you have 1 plus 10 to the minus
776
00:40:39.300 --> 00:40:41.079
20 plus minus 1.
777
00:40:41.079 --> 00:40:42.719
Oh, I see the problem already.
778
00:40:42.860 --> 00:40:46.639
So, 1 plus 10 to the minus 20, you don't
779
00:40:46.679 --> 00:40:50.329
have the precision to register that little thing you're adding,
780
00:40:50.750 --> 00:40:53.590
so that remains one. And then if you subtract again,
781
00:40:53.690 --> 00:40:57.000
it's zero. Whereas if you do one minus one and
782
00:40:57.039 --> 00:41:01.059
then add, it's zero plus your small number and you
783
00:41:01.119 --> 00:41:02.400
have a different result.
784
00:41:02.760 --> 00:41:06.940
Because the first item in the list is what defines
785
00:41:07.000 --> 00:41:09.050
the type that it's cast to, right?
786
00:41:09.070 --> 00:41:09.429
That's right.
787
00:41:09.550 --> 00:41:12.889
So the programming language defines the order and you have
788
00:41:12.909 --> 00:41:14.710
to make sure that you do things in the right order.
789
00:41:15.250 --> 00:41:19.050
And that can sneak up on you like A simple expression,
790
00:41:19.070 --> 00:41:22.849
a plus k minus 1, where a is a real number,
791
00:41:22.889 --> 00:41:25.090
k is an integer. That looks innocent, right?
792
00:41:25.670 --> 00:41:25.929
Yeah.
793
00:41:25.989 --> 00:41:29.750
Can't really go wrong with that. Well, what happens if
794
00:41:30.349 --> 00:41:34.139
a is a small number and k equals 1? Then
795
00:41:34.179 --> 00:41:36.860
you're going to have a plus 1. You're going to
796
00:41:36.920 --> 00:41:41.420
lose tons of precision there. And then subtract 1 again.
797
00:41:41.780 --> 00:41:45.599
So you've just lost lots of precision in that simple,
798
00:41:45.739 --> 00:41:47.019
innocent-looking operation.
799
00:41:47.630 --> 00:41:50.730
Yeah, you ended up at zero and it shouldn't have been.
800
00:41:50.889 --> 00:41:51.289
Yeah, or.
801
00:41:53.610 --> 00:41:57.449
Something close, but much less accurate than what you started
802
00:41:57.530 --> 00:41:57.829
out with.
803
00:41:58.110 --> 00:41:58.369
Right.
804
00:41:58.570 --> 00:42:03.369
Is there such a thing as a specialized computer and
805
00:42:03.449 --> 00:42:09.550
language that brings computer math closer to real math?
806
00:42:09.889 --> 00:42:14.159
You could say that there are symbolic computer systems, but
807
00:42:14.179 --> 00:42:15.340
that's really kind of cheating.
808
00:42:15.360 --> 00:42:15.739
Uh-huh.
809
00:42:16.360 --> 00:42:19.440
So I wouldn't say for practical use, not really.
810
00:42:19.460 --> 00:42:22.179
Okay. I mean, wasn't that what Fortran was about, was
811
00:42:22.219 --> 00:42:24.460
trying to get rid of these precision problems back in
812
00:42:24.480 --> 00:42:24.800
the day?
813
00:42:25.860 --> 00:42:30.969
Fortran was to make it easy to write out equations.
814
00:42:31.659 --> 00:42:34.630
It's literally derived from formula translation.
815
00:42:34.929 --> 00:42:35.150
Right.
816
00:42:35.789 --> 00:42:42.550
So eliminating the floating point traps and so on is
817
00:42:42.650 --> 00:42:45.090
really not practical to.
818
00:42:45.030 --> 00:42:48.989
Do in a In a language, you have to sort
819
00:42:49.010 --> 00:42:50.889
of choose your algorithm.
820
00:42:51.690 --> 00:42:51.929
Right.
821
00:42:52.710 --> 00:42:57.230
And so you have to, sometimes you get a formula
822
00:42:57.389 --> 00:43:00.880
and there's something that can blow up or where you
823
00:43:00.889 --> 00:43:03.780
can lose precision. And then you have to find a
824
00:43:04.940 --> 00:43:11.380
different path of obtaining the same result that doesn't have
825
00:43:11.420 --> 00:43:14.559
that problem. And that's the biggest challenge.
826
00:43:14.599 --> 00:43:17.039
Yeah, and so you're no longer just working on the
827
00:43:17.079 --> 00:43:19.340
math problem. You're working in the constraints of the computer.
828
00:43:19.420 --> 00:43:19.780
That's right.
829
00:43:19.940 --> 00:43:21.780
You have to adapt your math problem to what the
830
00:43:21.800 --> 00:43:22.760
computer can do for you.
831
00:43:22.800 --> 00:43:27.199
That's right. And that's why it's hard. That's why so
832
00:43:29.239 --> 00:43:31.199
much time is spent on getting it right.
833
00:43:32.480 --> 00:43:34.940
And the problem is if you're not aware of the problems,
834
00:43:34.960 --> 00:43:37.719
you just write an expression. And in certain test cases,
835
00:43:37.760 --> 00:43:40.949
it works fine. And in other cases, it ruins everything.
836
00:43:41.090 --> 00:43:47.079
Yeah, and... Most cases you'll test are like mid-range, normal,
837
00:43:47.760 --> 00:43:52.650
everyday things. And sure, it'll work fine with that. Like, yeah,
838
00:43:52.670 --> 00:43:55.050
you might lose a digit or two, but nothing relevant.
839
00:43:55.530 --> 00:43:59.610
But then extreme cases happen, and then, yeah, you might
840
00:43:59.630 --> 00:44:00.329
run into trouble.
841
00:44:00.550 --> 00:44:03.550
Disasters. Should we go down some of the paths of these?
842
00:44:04.130 --> 00:44:06.110
different math sets you've done here, I'm just trying to
843
00:44:06.130 --> 00:44:11.469
figure out what a Gauss Cronrod numerical integrator is. You're
844
00:44:11.510 --> 00:44:15.309
making that up, Richard. I wish I was. I'm just
845
00:44:15.409 --> 00:44:19.110
reading through the spec here and going, oh boy. If
846
00:44:19.130 --> 00:44:21.760
you don't know what that is, you probably don't need one.
847
00:44:22.449 --> 00:44:29.300
Yeah, Gauss is the famous mathematician who pioneered numerical integration,
848
00:44:29.320 --> 00:44:31.420
so computing the area under a curve.
849
00:44:32.090 --> 00:44:33.789
Using approximations.
850
00:44:34.090 --> 00:44:35.110
You said Gauss, right?
851
00:44:35.429 --> 00:44:36.570
And Gauss, yeah.
852
00:44:36.849 --> 00:44:39.610
Is that what the Gaussian blur is based on?
853
00:44:39.849 --> 00:44:40.610
That's also him.
854
00:44:40.789 --> 00:44:48.340
Wow. Like anything Gauss, like the Gaussian distribution, Gaussian blur,
855
00:44:48.360 --> 00:44:50.280
all those things are all the same person.
856
00:44:50.619 --> 00:44:52.940
Wow. Right. Clever guy.
857
00:44:53.079 --> 00:44:53.320
Yeah.
858
00:44:53.539 --> 00:44:58.119
So one way to compute errors is you compute the
859
00:44:58.159 --> 00:45:00.610
same result in two different ways, one more accurate than.
860
00:45:00.489 --> 00:45:00.960
The other one.
861
00:45:01.460 --> 00:45:02.599
And then you compare results.
862
00:45:03.039 --> 00:45:03.260
Right.
863
00:45:03.760 --> 00:45:08.300
And Gauss-Krohn wrote is a way of doing that with
864
00:45:08.400 --> 00:45:13.150
reusing some of the calculations you've done so that you've,
865
00:45:14.550 --> 00:45:17.949
so to minimize extra work. So that's what that is.
866
00:45:18.289 --> 00:45:21.349
No, and I appreciate that. So now I'm thinking the
867
00:45:21.369 --> 00:45:24.489
software engineer in me is like, okay. We measure this
868
00:45:24.570 --> 00:45:26.849
particular problem space in two different ways and then use
869
00:45:26.869 --> 00:45:28.809
an integrator to get what we think is the most
870
00:45:28.909 --> 00:45:29.989
accurate possible answer.
871
00:45:30.150 --> 00:45:30.510
That's right.
872
00:45:30.670 --> 00:45:32.889
Yeah, smart. And it's good to have a tool. You
873
00:45:32.909 --> 00:45:34.880
could try and code your way around that. You'd probably
874
00:45:34.889 --> 00:45:36.219
screw it up. Use the tool.
875
00:45:36.340 --> 00:45:36.739
That's right.
876
00:45:36.989 --> 00:45:41.239
And so that particular one is used for what's called
877
00:45:41.260 --> 00:45:47.360
adaptive integration, which means if you have a curve that's
878
00:45:47.440 --> 00:45:51.739
really oscillating a lot, like changes very quickly, if you
879
00:45:51.989 --> 00:45:54.750
try to approximate it with a few points, you're going
880
00:45:54.769 --> 00:45:59.250
to be way off. And so by computing the error,
881
00:45:59.289 --> 00:46:03.369
you can say, okay, we're good in this part of
882
00:46:03.389 --> 00:46:06.590
the function, but here we need to dig deeper and
883
00:46:06.639 --> 00:46:11.360
be more precise. So you do a recalculation there. What's
884
00:46:11.420 --> 00:46:14.780
the error now? And you keep doing that until your
885
00:46:14.800 --> 00:46:16.239
result is accurate enough.
886
00:46:16.900 --> 00:46:17.880
Accurate enough.
887
00:46:18.840 --> 00:46:23.860
I imagine FFTs, Fast Fourier transforms. I only know a
888
00:46:23.889 --> 00:46:26.280
lot of this stuff because, you know, the Gaussian blur
889
00:46:26.320 --> 00:46:28.579
you use in Photoshop and other things like that. And
890
00:46:28.659 --> 00:46:33.639
the FFTs we use in noise reduction algorithms in Adobe Audition.
891
00:46:34.199 --> 00:46:37.380
And I've been using them ever since I've been recording
892
00:46:37.420 --> 00:46:44.440
with digital audio. But from what I understand about noise reduction,
893
00:46:44.480 --> 00:46:48.880
it uses a fast Fourier transform and you select the
894
00:46:48.920 --> 00:46:52.019
number of points. And what it does in the audio
895
00:46:52.059 --> 00:46:56.409
world is it acts as, let's say it's 8,000 points.
896
00:46:57.050 --> 00:47:04.750
It's an 8,000 band compressor, right? So you have a
897
00:47:04.769 --> 00:47:09.010
compressor with three bands, high, low, and mid, or high, mid,
898
00:47:09.070 --> 00:47:12.730
and low, whatever. But if you break that up into
899
00:47:13.150 --> 00:47:18.650
the frequency spectrum into 8,000 bands, then it can compress
900
00:47:19.170 --> 00:47:23.829
each band. band individually using a fast Fourier transform I
901
00:47:23.869 --> 00:47:26.230
don't know how but I know it works.
902
00:47:27.590 --> 00:47:35.500
Fourier transform basically turns a signal into its frequencies and
903
00:47:35.539 --> 00:47:37.940
so then you can filter out high frequencies or mid
904
00:47:38.000 --> 00:47:44.199
or low or like apply equalizers and then transform back
905
00:47:45.019 --> 00:47:48.119
to get your new signal with the high frequencies filtered
906
00:47:48.219 --> 00:47:48.769
out Right.
907
00:47:48.829 --> 00:47:51.269
Makes a lot of sense, especially we use an 8K
908
00:47:51.789 --> 00:47:55.210
FFT size for noise reduction. Always have. And it seemed
909
00:47:55.230 --> 00:47:58.559
to be the sweet spot for audio, for speaking anyway.
910
00:47:59.440 --> 00:48:00.519
Just one of those things.
911
00:48:00.920 --> 00:48:01.119
Yeah.
912
00:48:01.360 --> 00:48:04.579
Wow. Should we, some other areas to explore here, Jeff?
913
00:48:04.619 --> 00:48:05.949
What do you want to, what would you like to
914
00:48:05.989 --> 00:48:09.429
talk about? Maybe some Jebyshev polynomials?
915
00:48:09.869 --> 00:48:12.349
Jebyshev is one of the luckiest people in the world.
916
00:48:14.230 --> 00:48:16.219
This is a mathematician, I presume.
917
00:48:16.360 --> 00:48:21.960
He's a mathematician. I'm not even sure which century he's from.
918
00:48:22.260 --> 00:48:22.500
Right.
919
00:48:22.880 --> 00:48:27.719
But he played with a certain type of polynomials that
920
00:48:28.929 --> 00:48:32.329
looked interesting. And so they ended up being named after him.
921
00:48:33.449 --> 00:48:37.429
And these days they're used all over the place. Right.
922
00:48:38.349 --> 00:48:43.559
Because they're defining property. What makes them useful is that
923
00:48:44.539 --> 00:48:49.539
They're very even. They oscillate, yes, but they oscillate within
924
00:48:49.559 --> 00:48:55.039
a narrow band, and it's the narrowest possible band. Oh, interesting.
925
00:48:55.340 --> 00:49:02.170
JPL uses that for their planetary models. They will give
926
00:49:02.269 --> 00:49:08.789
out positions of planets and asteroids and everything as a
927
00:49:08.949 --> 00:49:18.429
series of Cheverchev polynomials. because you can very accurately model
928
00:49:19.289 --> 00:49:23.650
basically any curve using them. And what I was saying
929
00:49:23.710 --> 00:49:32.510
about controlling the growth of your errors, they're extremely favorable
930
00:49:32.550 --> 00:49:36.789
that way. So you will get minimal error propagation, which is, again, why.
931
00:49:36.650 --> 00:49:39.650
They're so common. I looked him up. He was a
932
00:49:39.710 --> 00:49:40.340
Russian from the 1800s.
933
00:49:40.389 --> 00:49:40.610
Yeah.
934
00:49:40.630 --> 00:49:45.670
Sounds right. That's a lot of mathematicians, actually, I think.
935
00:49:45.889 --> 00:49:48.630
And he was at a time of defining all this stuff. So, again,
936
00:49:49.230 --> 00:49:51.510
you've come back to this a few times, Jeff. It's
937
00:49:51.550 --> 00:49:55.449
like you're trying to work through a set of data
938
00:49:55.469 --> 00:49:58.360
and get an aggregate or some kind of valuation from
939
00:49:58.400 --> 00:49:59.880
it without introducing a lot of error.
940
00:50:00.059 --> 00:50:00.260
Yeah.
941
00:50:00.320 --> 00:50:02.159
And these are the kinds of tools you use to
942
00:50:02.179 --> 00:50:02.940
try and keep the errors.
943
00:50:03.019 --> 00:50:06.900
And the problem is, too– As I said earlier, as
944
00:50:06.940 --> 00:50:10.420
soon as you bring a real world number into your
945
00:50:10.460 --> 00:50:14.510
computing system, you have some deviation from reality. And there's
946
00:50:14.550 --> 00:50:15.489
another famous.
947
00:50:15.650 --> 00:50:17.889
Because the computer does an approximation on it.
948
00:50:17.969 --> 00:50:18.550
Yeah.
949
00:50:19.329 --> 00:50:24.010
There's another famous and rather tragic example from the Gulf
950
00:50:24.030 --> 00:50:28.610
War in 1991. There was a Scud missile heading towards
951
00:50:28.630 --> 00:50:34.070
a U.S. base in Tehran in Saudi Arabia. And they
952
00:50:34.090 --> 00:50:38.550
had a Patriot system. for air defense, but it failed,
953
00:50:38.630 --> 00:50:44.539
it missed. And the reason it missed was round off error.
954
00:50:45.400 --> 00:50:50.260
They were counting time by incrementing a counter every tenth
955
00:50:50.280 --> 00:50:53.980
of a second. So after about four days, the counter
956
00:50:54.019 --> 00:50:57.630
was at something like three and a half million. And
957
00:50:57.670 --> 00:51:03.849
then they computed the current time by multiplying that counter
958
00:51:03.869 --> 00:51:09.989
by by 0.1. 0.1 is not a floating point number,
959
00:51:10.090 --> 00:51:12.929
not a binary floating point number. So there's this very
960
00:51:13.010 --> 00:51:18.829
tiny error there of about 95 nanoseconds. But when you
961
00:51:18.869 --> 00:51:24.010
multiply 9 to 5 nanoseconds by 3.5 million, you get
962
00:51:24.050 --> 00:51:28.360
about three-tenths of a second. And missiles fly very fast
963
00:51:28.380 --> 00:51:31.119
and cover a lot of ground in that time. And
964
00:51:31.179 --> 00:51:35.949
so the interceptor missed And unfortunately, I think 28 people
965
00:51:35.969 --> 00:51:41.400
died in that attack. So, it can have very serious consequences.
966
00:51:41.940 --> 00:51:42.599
Yeah, no kidding.
967
00:51:42.880 --> 00:51:45.960
We were talking about in the news stories, Boeing and
968
00:51:45.980 --> 00:51:50.300
the problems that they had. And I wonder if, I mean,
969
00:51:50.320 --> 00:51:56.969
it was obvious incompetence in a culture of, you know,
970
00:51:57.090 --> 00:52:00.170
not reporting the truth and trying to appease the higher-ups
971
00:52:00.230 --> 00:52:03.780
and all that stuff and sycophancy, but I wonder if
972
00:52:04.119 --> 00:52:10.539
any of that stemmed from having bad algorithms or bad math.
973
00:52:11.440 --> 00:52:11.800
Do you know?
974
00:52:12.840 --> 00:52:20.920
I have no idea. There have been mistakes with the
975
00:52:20.960 --> 00:52:24.699
Ariane rocket and the example you gave too earlier.
976
00:52:24.780 --> 00:52:26.920
Sure, which I think is a really interesting one just
977
00:52:26.940 --> 00:52:30.010
because they– changed the precision on the number and then
978
00:52:30.369 --> 00:52:32.650
introduced it into a different rocket that behaved differently and
979
00:52:32.829 --> 00:52:35.909
that number suddenly was a huge problem. And more importantly,
980
00:52:35.929 --> 00:52:39.409
the software doesn't get an overflow and the software just
981
00:52:39.449 --> 00:52:42.269
treats it as a number still, not acknowledging that, no,
982
00:52:42.289 --> 00:52:44.920
that's not a valid number and you should stop what
983
00:52:44.940 --> 00:52:46.539
you're doing. Whatever you do from here is going to
984
00:52:46.579 --> 00:52:52.179
be worse, not better. The MCAS story, which was part
985
00:52:52.199 --> 00:52:54.760
of that 737 MAX problem, is a complicated one and
986
00:52:54.800 --> 00:52:59.079
probably none Appropriate here, but yeah, it was the decision
987
00:52:59.159 --> 00:53:03.039
on hardware and software and how you communicated to the
988
00:53:03.099 --> 00:53:07.429
pilots combined that creates that situation.
989
00:53:07.849 --> 00:53:13.710
Speaking of radiation doses, there's also a story about a
990
00:53:13.789 --> 00:53:20.880
system to administer the radiation where some people got bad
991
00:53:20.920 --> 00:53:26.019
burns and it turned out They looked into it, maybe
992
00:53:26.079 --> 00:53:28.619
as the operator not experienced. And no, the operator is
993
00:53:28.659 --> 00:53:32.179
very experienced. And actually that turned out to be the
994
00:53:32.219 --> 00:53:36.940
problem because they entered the information so quickly that the
995
00:53:36.980 --> 00:53:42.360
system couldn't keep up and skipped an input. And that
996
00:53:42.420 --> 00:53:50.699
led to overdoses. So there's all kinds of like the
997
00:53:50.739 --> 00:53:53.800
numerical part is one thing, but there's also the good
998
00:53:54.000 --> 00:54:01.789
software practices of making allowances for exceptions and treating exceptional
999
00:54:01.829 --> 00:54:05.010
conditions adequately and correctly.
1000
00:54:05.269 --> 00:54:10.949
Yeah. Yeah. It's interesting to try and write software that
1001
00:54:11.010 --> 00:54:13.079
contends with that kind of thing because the consequence was
1002
00:54:13.119 --> 00:54:17.500
so serious. You know, they're just sort of recognizing that
1003
00:54:17.559 --> 00:54:23.449
the data doesn't make sense. What's reasonable. before it actually runs.
1004
00:54:24.369 --> 00:54:30.030
The Therac-25 issue, that was the radiation treatment where if
1005
00:54:30.050 --> 00:54:33.630
you entered the data too quickly, software went into a
1006
00:54:33.650 --> 00:54:34.309
race condition.
1007
00:54:35.250 --> 00:54:38.650
And one thing they did, I believe, in that instance
1008
00:54:38.789 --> 00:54:46.179
is the previous version of that equipment had hardware guards. Right.
1009
00:54:46.380 --> 00:54:50.239
So if the radiation was too high or voltage or
1010
00:54:50.320 --> 00:54:54.949
whichever way they measured it, it would refuse to do that.
1011
00:54:55.449 --> 00:54:57.510
But they took those off and they replaced them with
1012
00:54:57.550 --> 00:55:01.150
software tests. That obviously didn't work.
1013
00:55:01.550 --> 00:55:03.929
Yeah, obviously created other consequences, no question.
1014
00:55:04.329 --> 00:55:08.449
So your point is well taken. Math is kind of important.
1015
00:55:08.489 --> 00:55:14.780
To get right. Well, yeah, precision. I don't know that
1016
00:55:14.820 --> 00:55:18.920
we even now actually understand fully the compromises that were
1017
00:55:18.960 --> 00:55:21.019
made to store numbers in computers efficiently.
1018
00:55:22.679 --> 00:55:26.599
They did a pretty good job, actually, with the standard
1019
00:55:28.579 --> 00:55:37.769
IEEE 754 format. In some ways, it's quite ingenious. The numerical,
1020
00:55:37.929 --> 00:55:40.829
if you compare the bit value, if you look at
1021
00:55:40.869 --> 00:55:46.340
it as a 64-bit integer, it is in the correct
1022
00:55:46.380 --> 00:55:50.820
sort order. So you can compare the numbers as integers
1023
00:55:50.840 --> 00:55:54.710
and and have the correct sort order, except for.
1024
00:55:54.630 --> 00:56:00.090
The not a number cases, which are an annoyance.
1025
00:56:01.250 --> 00:56:06.260
And there's another problem that's not obvious at first sight.
1026
00:56:07.940 --> 00:56:10.760
Because of the format, you always have an integer times
1027
00:56:10.800 --> 00:56:14.219
a power of two. And so there are as many
1028
00:56:14.619 --> 00:56:18.469
floating point numbers between one and two as there are
1029
00:56:18.530 --> 00:56:23.380
between two and four, or four and eight. in 16,
1030
00:56:23.380 --> 00:56:29.099
so they've become scarcer and sparser, the more, the larger
1031
00:56:29.119 --> 00:56:31.840
your numbers get, and they get closer and closer together.
1032
00:56:31.860 --> 00:56:34.780
The smaller your numbers get.
1033
00:56:36.280 --> 00:56:38.400
And then the question is, well, what do you do
1034
00:56:38.440 --> 00:56:43.570
close to zero? And the solution they found was, well,
1035
00:56:44.489 --> 00:56:48.829
let's just switch from a floating point format into two
1036
00:56:49.309 --> 00:56:52.500
times a power of two. to a fixed point format.
1037
00:56:53.860 --> 00:57:01.349
And so all the numbers with exponent zero are called
1038
00:57:01.630 --> 00:57:07.050
subnormal numbers and they are a fixed point format. So
1039
00:57:07.070 --> 00:57:11.610
they are that number interpreted as an integer times, I
1040
00:57:11.630 --> 00:57:12.329
think it's two to.
1041
00:57:12.250 --> 00:57:13.250
The power minus 1,075.
1042
00:57:13.250 --> 00:57:19.590
So that when you get to zero, You have what
1043
00:57:19.610 --> 00:57:22.980
they call gradual underflow. You don't just cut to zero
1044
00:57:23.000 --> 00:57:27.579
straight away. You have like a little bit of breathing
1045
00:57:27.619 --> 00:57:29.000
room to get there.
1046
00:57:29.820 --> 00:57:31.900
Yeah, this is way more complicated than you think about.
1047
00:57:31.920 --> 00:57:33.409
Most of the time we just use numbers and don't
1048
00:57:33.429 --> 00:57:35.949
worry about it. Sometimes you want integers and sometimes you
1049
00:57:35.969 --> 00:57:40.829
want floating point and you're fine. But then this is here.
1050
00:57:41.010 --> 00:57:43.550
I've just looked at this huge roster of capabilities that
1051
00:57:43.590 --> 00:57:47.019
are in all these exception cases. All right. How do
1052
00:57:47.039 --> 00:57:49.039
people figure out they need your tool, Jeff?
1053
00:57:49.280 --> 00:57:56.050
Well, most people just need some kind of calculation where
1054
00:57:56.090 --> 00:58:01.710
they need the level of extraction that our library provides.
1055
00:58:02.250 --> 00:58:06.630
So if you have to solve a set of equations, okay,
1056
00:58:06.650 --> 00:58:10.230
you can do it all yourself and try to figure
1057
00:58:10.250 --> 00:58:11.909
out how to do it efficiently.
1058
00:58:11.929 --> 00:58:12.389
Mm-hmm.
1059
00:58:12.869 --> 00:58:15.150
Or you can use my library and just say, okay,
1060
00:58:15.170 --> 00:58:16.860
these are a number of delegates.
1061
00:58:17.199 --> 00:58:19.300
And to be clear, your library is not free.
1062
00:58:19.619 --> 00:58:20.059
No, it's not.
1063
00:58:20.360 --> 00:58:22.860
Yeah. And not that I have a problem with that.
1064
00:58:22.880 --> 00:58:24.460
It makes sense. It sounds like you've done a ton
1065
00:58:24.500 --> 00:58:28.380
of work. And it's worth it for the folks. If
1066
00:58:28.420 --> 00:58:30.070
you need it, you need it. And you should pay
1067
00:58:30.090 --> 00:58:30.239
for it.
1068
00:58:30.250 --> 00:58:31.769
If you need it, you need it. That's right.
1069
00:58:31.789 --> 00:58:32.150
That's right.
1070
00:58:33.349 --> 00:58:35.369
This is literally a tool to save lives and stop
1071
00:58:35.389 --> 00:58:36.809
spacecraft from exploding. Yeah.
1072
00:58:37.969 --> 00:58:42.130
Yeah. talk about performance a little bit. Uh, some of the,
1073
00:58:42.269 --> 00:58:45.349
I mean, the.net framework has gotten more and more performant
1074
00:58:45.369 --> 00:58:48.880
with every release. Was there ever a time when you considered,
1075
00:58:49.139 --> 00:58:51.699
you know, dropping to assembler to do stuff because it
1076
00:58:51.760 --> 00:58:52.800
wasn't fast enough?
1077
00:58:52.940 --> 00:58:56.440
Well, we've been doing this for 20 years and, um,
1078
00:58:58.199 --> 00:59:05.400
we've seen a few performance, uh, concepts come and go.
1079
00:59:05.400 --> 00:59:07.760
Uh, when, uh.
1080
00:59:07.769 --> 00:59:14.420
The uh, task parallel library was first introduced around 2010,
1081
00:59:14.420 --> 00:59:18.039
that seemed to be the thing to speed things up. Uh,
1082
00:59:18.260 --> 00:59:21.099
turned out there was so much overhead that it was
1083
00:59:21.239 --> 00:59:26.500
limited in what we could do with it. Um, so
1084
00:59:27.380 --> 00:59:31.530
one example of where I did, um, role my own,
1085
00:59:31.590 --> 00:59:38.130
so to speak, is big integer. The initial implementation that
1086
00:59:38.300 --> 00:59:46.260
shift with. NET 4.0 in 2010 was adequate for small sizes,
1087
00:59:46.300 --> 00:59:52.099
but as soon as your numbers got large, it got
1088
00:59:52.900 --> 00:59:58.440
slower and slower. And so we did some work there
1089
00:59:58.480 --> 01:00:03.230
to make a faster version of that, But I really
1090
01:00:03.269 --> 01:00:04.150
have to give it to the.
1091
01:00:04.369 --> 01:00:05.010
NET guys.
1092
01:00:05.230 --> 01:00:08.550
In recent years, they've done so much to bring their
1093
01:00:08.590 --> 01:00:17.619
numerical side of things forward into what's actually now to
1094
01:00:17.659 --> 01:00:21.619
the point where we're considering giving up our big integer
1095
01:00:21.980 --> 01:00:22.860
and just using the.
1096
01:00:22.960 --> 01:00:24.079
NET standard version.
1097
01:00:25.500 --> 01:00:28.989
Do you utilize span of t? I know that's a
1098
01:00:29.050 --> 01:00:29.909
huge win.
1099
01:00:29.929 --> 01:00:31.309
We use it all the time.
1100
01:00:31.630 --> 01:00:31.849
Yeah.
1101
01:00:31.989 --> 01:00:32.329
Oh, wow.
1102
01:00:32.550 --> 01:00:36.150
All the time because, well, one of the advantages, too,
1103
01:00:36.349 --> 01:00:41.360
is a span can be over managed memory, but it
1104
01:00:41.380 --> 01:00:44.980
can also be over unmanaged memory, like anything you get
1105
01:00:45.039 --> 01:00:53.119
from a third-party library or application. And so using span
1106
01:00:53.239 --> 01:00:58.510
allows us to use the same code for– Managed memory,
1107
01:00:59.329 --> 01:01:02.670
so vectors stored in managed memory or in native memory.
1108
01:01:03.829 --> 01:01:07.230
And then the performance, too, it's very compact. It lets you,
1109
01:01:08.170 --> 01:01:11.469
and it's very much optimized more and more. It's actually
1110
01:01:11.489 --> 01:01:16.760
interesting when we look at our test suite. You can
1111
01:01:16.860 --> 01:01:18.690
see we still support.
1112
01:01:18.679 --> 01:01:20.059
NET 4.6.2 and. NET standards.
1113
01:01:25.139 --> 01:01:27.739
And you can see in our execution times of the
1114
01:01:27.780 --> 01:01:31.219
test suite how long it takes for each edition.
1115
01:01:32.570 --> 01:01:33.090
To run.
1116
01:01:34.250 --> 01:01:39.849
And without even changing any code, you can see a
1117
01:01:39.889 --> 01:01:45.300
progression by like every edition is like 10% faster overall.
1118
01:01:46.099 --> 01:01:47.719
And it's just a runtime that does that.
1119
01:01:47.940 --> 01:01:51.820
Yep. And overhead, memory overhead has also gone way down.
1120
01:01:52.039 --> 01:01:52.880
Yeah.
1121
01:01:53.119 --> 01:01:56.530
Just wonderful. Well, it's good to see that you picked
1122
01:01:56.550 --> 01:01:57.190
the right horse.
1123
01:01:58.230 --> 01:01:59.489
Yeah, 20-plus year run.
1124
01:02:00.030 --> 01:02:01.170
Yeah.
1125
01:02:01.409 --> 01:02:04.989
I'm very impressed with the work they've been doing. And
1126
01:02:05.050 --> 01:02:12.469
also in the library itself, when, again, Complex Numbers first.
1127
01:02:12.269 --> 01:02:13.800
Came out, also in.
1128
01:02:13.429 --> 01:02:20.849
NET 4, it was really like you're– textbook or school
1129
01:02:20.869 --> 01:02:26.280
book implementation. It was just the formulas without really understanding
1130
01:02:26.340 --> 01:02:28.559
the intricacies of.
1131
01:02:30.099 --> 01:02:31.559
How to get precise results.
1132
01:02:32.699 --> 01:02:36.219
Even in there, when you computed the square root of
1133
01:02:36.260 --> 01:02:41.949
minus one, which should be purely imaginary I, because that's
1134
01:02:41.969 --> 01:02:46.550
the definition of the imaginary unit, it was off, it
1135
01:02:46.590 --> 01:02:52.150
wasn't correct. But in the last couple of years, and
1136
01:02:52.210 --> 01:02:56.650
now with. NET 11, they've done a ton of work
1137
01:02:56.730 --> 01:03:01.650
to clean that up. And we're not quite ready to
1138
01:03:01.710 --> 01:03:10.280
give up our complex number implementation, but we're seriously considering it. So, again,
1139
01:03:10.920 --> 01:03:12.500
great job,. NET team.
1140
01:03:12.679 --> 01:03:14.280
We should pass it along to Steve and Todd. Those
1141
01:03:14.320 --> 01:03:15.420
guys are freaking brilliant.
1142
01:03:15.619 --> 01:03:19.429
They are, yeah. Well, Jeffrey, thanks for hanging with us.
1143
01:03:19.929 --> 01:03:22.130
We went a little bit over, but that's only because
1144
01:03:22.190 --> 01:03:24.769
we had such a long intro. But it was great
1145
01:03:24.849 --> 01:03:29.219
just going through your interview without an interruption. And this
1146
01:03:29.320 --> 01:03:32.860
is awesome stuff. And I'm actually a little impressed with
1147
01:03:32.960 --> 01:03:34.840
both Richard and I for keeping up with you.
1148
01:03:35.980 --> 01:03:37.860
I think Jeff is a great explainer.
1149
01:03:37.920 --> 01:03:38.760
You are, yeah.
1150
01:03:38.800 --> 01:03:39.840
Which I really appreciate.
1151
01:03:40.679 --> 01:03:41.119
Thank you.
1152
01:03:41.460 --> 01:03:43.789
And good luck in the future. And thanks very much.
1153
01:03:43.849 --> 01:03:44.269
Thank you.
1154
01:03:44.309 --> 01:03:47.889
And we will talk to you dear listener next time on.
1155
01:03:47.599 --> 01:03:48.619
NET Rocks.
1156
01:04:10.340 --> 01:04:13.039
NET Rocks is brought to you by Franklin's Net and
1157
01:04:13.099 --> 01:04:17.800
produced by Plop Studios. a full-service audio, video, and post-production
1158
01:04:17.840 --> 01:04:21.849
facility located physically in New London, Connecticut, and, of course,
1159
01:04:21.909 --> 01:04:30.050
in the cloud, online at pwop.com. Visit our website at dotnetrocks.com
1160
01:04:30.489 --> 01:04:35.170
for RSS feeds, downloads, mobile apps, comments, and access to
1161
01:04:35.190 --> 01:04:38.590
the full archives going back to show number one, recorded
1162
01:04:38.630 --> 01:04:42.489
in September 2002. And make sure you check out our sponsors.
1163
01:04:42.769 --> 01:04:46.139
They keep us in business. Now go write some code.
1164
01:04:46.179 --> 01:04:46.820
See you next time.