72 views (last 30 days)

I was banging my head against the wall looking for the error in my code, that kept returning "false" when it should have returned true. I finally realised that my error was because in MATLAB (or at least in my copy) pi^0.5^2==pi returns "false". The same goes for sqrt(pi)^2==pi. I assume this is because the machine precision of pi is more exact then the machine precison of the square root function, even though they are identical up to 16 digits.

I have some unelegant solutions to this. e.g writing down pi=3.141592 at the begining of my code. is there a better solution? a more percise calculaion of the square root?

many thanks

Steven Lord
on 13 Jan 2021

I would have both the Area and Diameter properties depend upon a third (maybe public, maybe internal) property. Setting either Area or Diameter computes what the value of that internal property should be and getting them computes the value using that internal property.

classdef Circle715788

properties(Dependent)

Area

Diameter

end

properties

Radius

end

methods % Constructor

function obj = Circle715788(r)

obj.Radius = r;

end

end

methods % Property accessors

function obj = set.Area(obj, newArea)

R = sqrt(newArea./pi);

obj.Radius = R;

end

function obj = set.Diameter(obj, newDiameter)

obj.Radius = newDiameter./2;

end

function A = get.Area(obj)

A = pi*obj.Radius.^2;

end

function D = get.Diameter(obj)

D = 2*obj.Radius;

end

end

end

Use as:

>> Q = Circle715788(1)

Q =

Circle715788 with properties:

Area: 3.1416

Diameter: 2

Radius: 1

>> Q = Circle715788(4)

Q =

Circle715788 with properties:

Area: 50.2655

Diameter: 8

Radius: 4

>> Q.Area = pi

Q =

Circle715788 with properties:

Area: 3.1416

Diameter: 2

Radius: 1

Steven Lord
on 26 Jan 2021

On my Windows 10 machine running release R2020b:

>> C = Circle715788(7);

>> tic; for k = 1:1e6, A = C.Area; end, toc

Elapsed time is 0.132099 seconds.

>> tic; for k = 1:1e6, A = C.Area; end, toc

Elapsed time is 0.112353 seconds.

>> tic; for k = 1:1e6, A = C.Area; end, toc

Elapsed time is 0.108369 seconds.

>> tic; for k = 1:1e6, A = C.Area; end, toc

Elapsed time is 0.105188 seconds.

>> tic; for k = 1:1e6, A = C.Area; end, toc

Elapsed time is 0.102445 seconds.

So about a tenth of a second for 1e6 queries.

>> tic; for k = 1:1e6, C.Radius = k; A = C.Area; end, toc

Elapsed time is 0.231171 seconds.

>> tic; for k = 1:1e6, C.Radius = k; A = C.Area; end, toc

Elapsed time is 0.210652 seconds.

>> tic; for k = 1:1e6, C.Radius = k; A = C.Area; end, toc

Elapsed time is 0.208293 seconds.

Two-tenths for 1e6 property sets and gets.

You might be able to speed this up, particularly if the calculations of Area / Diameter are expensive, using a memoize object inside your Area / Diameter calculations to cache the values for repeated Radius values.

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!
## 5 Comments

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/715788-square-root-of-pi#comment_1260988

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/715788-square-root-of-pi#comment_1260988

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/715788-square-root-of-pi#comment_1261133

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/715788-square-root-of-pi#comment_1261133

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/715788-square-root-of-pi#comment_1261193

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/715788-square-root-of-pi#comment_1261193

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/715788-square-root-of-pi#comment_1261198

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/715788-square-root-of-pi#comment_1261198

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/715788-square-root-of-pi#comment_1261323

⋮## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/715788-square-root-of-pi#comment_1261323

Sign in to comment.