Precision - Printable Version +- QB64 Phoenix Edition (https://staging.qb64phoenix.com) +-- Forum: Chatting and Socializing (https://staging.qb64phoenix.com/forumdisplay.php?fid=11) +--- Forum: General Discussion (https://staging.qb64phoenix.com/forumdisplay.php?fid=2) +--- Thread: Precision (/showthread.php?tid=1172) |
Precision - Chris - 11-22-2022 Hello For some rather complicated mathematical calculations, I use the # tag to increase the precision. As a result of the calculations, errors arise. A professional astronomer suggested that he use more than 32 bits for his calculations. So the question is how to increase the accuracy of the calculations? Is the # sign already the most accurate option ?. Regards Chris RE: Precision - bplus - 11-22-2022 There is ## but not that much better. Hi Chris, welcome to forum! I sure hope we are talking about QB64 preferable pe versions. RE: Precision - Pete - 11-22-2022 We usually write our own programs for these situations. Search terms for this forum: 1) "String math" Fast for +_*/ but slow for decimal powers and nth roots. (Authors Pete, bplus, Treebeard). 2) "Dec_Float" To 52 places, if memory serves. (Author: Jack). For QB64 variable types, look here: https://qb64phoenix.com/qb64wiki/index.php/Variable_Types Pete Precision - Chris - 11-22-2022 ## But is it more than 32 bits ?. I don't really understand what more than 32 bit accuracy means. RE: Precision - Chris - 11-22-2022 I don't know how it happened: two topics RE: Precision - Chris - 11-22-2022 How to apply dec float here? It only gives part of the code. rplus1 = c1plus1 MOD 1095 rminus1 = c1minus1 MOD 1095 v1 = 32336 * q + INT((15 * q + 765433 * R + 12084) / 25920) v1plus1 = 32336 * qplus1 + INT((15 * qplus1 + 765433 * rplus1 + 12084) / 25920) v1minus1 = 32336 * qminus1 + INT((15 * qminus1 + 765433 * rminus1 + 12084) / 25920) v2 = v1 + INT(6 * (v1 / 7)) MOD 2 v2plus1 = v1plus1 + INT(6 * (v1plus1 / 7)) MOD 2 v2minus1 = v1minus1 + INT(6 * (v1minus1 / 7)) MOD 2 L2 = v2plus1 - v2 L2minus1 = v2 - v2minus1 v3 = 2 * (INT((L2 + 19) / 15) MOD 2) v4 = INT((L2minus1 + 7) / 15) MOD 2 c2 = v2 + v3 + v4 v3plus1 = 2 * (INT((L2plus1 + 19) / 15) MOD 2) v4plus1 = INT((L2 + 7) / 15) MOD 2 c2plus1 = v2plus1 + v3 + v4 L = c2plus1 - c2 c8 = INT((L + 7) / 2) MOD 15 c9 = -(INT((385 - L) / 2) MOD 15) c3 = INT((384 * x3 + 7) / 13) + c8 * INT((x3 + 4) / 12) + c9 * INT((x3 + 3) / 12) RE: Precision - SMcNeill - 11-22-2022 (11-22-2022, 09:04 PM)Chris Wrote: I don't know how it happened: two topics No worries. I merged them for you. ? RE: Precision - SMcNeill - 11-22-2022 Easiest fix for you would appear to be: _DEFINE A-Z AS _FLOAT Add to top of code and see if that helps. RE: Precision - mnrvovrfc - 11-22-2022 Welcome to the forums. You can't have an astronomer nor anybody else decide for you. Now you presented some code, you'll have to declare all those variables "AS DOUBLE" and see if the results are satisfactory. If the code stands just as it is, the variables will be type "SINGLE" which is lesser precision than "DOUBLE". Using type sigils is a bad habit taught to new programmers of BASIC. Learn to use "DIM" to declare variables so there is no confusion what type it is. Yes the sigil helps to describe what type straight away but what if other "simple" types come around in the future? How to decorate an UDT variable? So with this program try to put "#" right after each word which is more time consuming than a single "DIM" line. But it's only my opinion. Another bad habit which is a shortcut, is to place "_DEFINE A-Z AS DOUBLE" as the first line of this code that was presented. RE: Precision - bplus - 11-22-2022 Probably don't want to mix floats (##) with MOD. Maybe you want _Integer64 Type (&& suffix) v1 = 32336 * q + INT((15 * q + 765433 * R + 12084) / 25920) I don't know, do you expect rounding v1 to Integer or want to keep a float? |