BookmarkSubscribeRSS Feed
SASStala1
Calcite | Level 5

Ich habe in meiner Datei 18 Zeichen eine Kommazahl davon immer 16 Nachkommastellen  z.b.  0,1574167635461456

 
data test;
a='0,1574167635461456';
b=input(a,commax18.16);
c=input(a,numx18.16);
format b commax25.16 c 32.29;
put a b c;
run;
Beim Umwandeln von char in num gehen 2 nachkommastellen verloren, auch wenn ich beim Input a numx18.16 angebe.
b=0,1574167635461400
c=0.15741676354614000000000000000
Ich benötige die Variable numerisch , um damit weiter zu rechnen.
 
Was muss ich angeben, damit mir 16 Nachkommastellen erhalten bleiben?
 
Vielen Dank für Eure Hilfe

 

 

4 REPLIES 4
Kurt_Bremser
Super User

Zuallererst sollte man beim INPUT keine Nachkommastellen angeben, da man damit das Komma im String übersteuert. SAS entfernt das Komma, liest 18 Stellen, und dividiert durch 10**16.

Weiters stösst man mit so vielen Stellen bereits an die Präzisionsgrenze des 8 Byte Floating Point Formats, in dem SAS Zahlen speichert; die 16. Nachkommastelle wird immer ungenau sein.

FreelanceReinh
Jade | Level 19

Hallo, @SASStala1, und willkommen in den SAS Support Communities!

 

Es scheint nur so, dass durch die Typumwandlung zwei Nachkommastellen "verloren" gehen. Die beobachtete Ungenauigkeit kommt im wesentlichen durch die gerundete Darstellung der allermeisten numerischen Formate zustande (auch wenn "ausreichend viele" Nachkommastellen im Format spezifiziert werden). Den exakten Wert, der in einer numerischen Variable gespeichert ist, erhält man am sichersten mit Formaten wie HEX16. oder BINARY64., freilich nicht in dezimaler Darstellung.

 

Sofern die interne 64-Bit-Genauigkeit ausreicht, kann man mit einem benutzerdefinierten PICTURE-Format fehlende Dezimalstellen sichtbar machen, insgesamt aber höchstens 16. Im vorliegenden Beispiel ist das der Fall, denn intern (siehe HEX16.- oder BINARY64.-Darstellung) wird diese Zahl als eine Binärzahl gespeichert, die dezimal 0,15741676354614558830... entspricht, d. h., der Rundungsfehler gegenüber der Zahl in der Character-Variablen beträgt in Wirklichkeit nur etwa 1.17E-17.

proc format;
picture longfmt
0<-<1='9.999999999999999E-l' (mult=1e16);
run;

proc print data=test;
format b longfmt.;
var b;
run;

Ergebnis:

Obs             b

 1     1.574167635461456E-l

Die Dezimalstellen sind nun (mit Glück) alle sichtbar. Das der Beschränkung auf 16 Ziffernplatzhalter geschuldete kleine "L" in "E-l" ist allerdings unschön.

 

Falls die 16 Nachkommastellen unverfälscht in einem Bericht benötigt werden, würde ich eher die ursprüngliche Character-Variable verwenden und ggf. für Berechnungen eine zusätzliche numerische Variable anlegen (und die Rundungsfehler in diesem Grenzbereich der mit numerischen Variablen möglichen Genauigkeit im Auge behalten).

 

 

PS: Es gibt hier mit CoDe SAS auch ein deutschsprachiges Unterforum: https://communities.sas.com/t5/CoDe-SAS-German/gp-p/code_sas

DavePrinsloo
Pyrite | Level 9

Doing calculations in SAS 9.4 (not Viya) with numbers with 16 decimal places will not result in accurate calculations in the lower decimal places.   

In one of my projects, we needed to create a sum of number in millions of rows that had 18 significant digits.   

We therefore split we split the numbers into 2 parts and converted each part into 9 digit integers.

At then end of the calculation, you need to calculate how much to carry-over from the less significant columns.   (This is similar to how you add a long list of of numbers with pen and paper)

 

SASStala1
Calcite | Level 5

Vielen Dank für die hilfreichen Antworten.

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 4 replies
  • 2554 views
  • 0 likes
  • 4 in conversation