Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: [FreePascal] Potenzierung

39 views
Skip to first unread message

G.B.

unread,
Oct 18, 2016, 4:17:06 AM10/18/16
to
On 17.10.16 18:08, Volker Englisch wrote:
> Ok, der Exponent ist
> keine Ganzzahl - aber das sollte doch kein Problem sein, oder?
> Vielleicht hat ja jemand eine Idee, woran das liegen könnte.

Im Konjunktiv: Die Potenz ist nur (wie üblich) für ganzzahlige
Exponenten definiert. Bei Brüchen wie 2/3 im Exponenten würde
ich in die Bestandteile zerlegen und die entsprechenden
Operationen suchen. Wurzeln dürfte es geben?

--
"HOTDOGS ARE NOT BOOKMARKS"
Springfield Elementary teaching staff

Thomas Koenig

unread,
Oct 18, 2016, 3:06:55 PM10/18/16
to
Volker Englisch <lrz...@rsli.de> schrieb:
> Ich bräuchte zum ersten Mal die Potenzfunktion in Pascal. Die will aber
> leider nicht so wie ich das erwarten würde. Antwort vom Compiler:
>
> ei.pas(16,26) Error: Operator is not overloaded
> ei.pas(21,2) Fatal: There were 1 errors compiling module, stopping
>
> Das ist genau die Stelle, an der das ** steht. Ok, der Exponent ist
> keine Ganzzahl - aber das sollte doch kein Problem sein, oder?

Ich kenne die Variante jetzt nicht, aber es macht schon einen
Unterschied, ob der Exponent eine Ganzzahl ist oder nicht.

Für eine Ganzzahl kann man die Potenz mit Multiplikationen und ggf.
einer Division erledigen.

Für eine Floating Point - Zahl kann man die Identität

a**b = exp(ln(a)*b)

ausnutzen.

> Zeit := 0.465 * (Masse ** (2/3)) * ln(0.76 * ((Tw - Ts) / Tw - Ti));
^^^

Das ist in Pascal nicht gleich Null? In Fortran oder C wäre es das.

Thomas Koenig

unread,
Oct 19, 2016, 3:07:41 PM10/19/16
to
Volker Englisch <lrz...@rsli.de> schrieb:
> Thomas Koenig schrieb:

> Jetzt stehe ich auf dem Schlauch. Warum sollte 2/3 gleich Null sein?
> Ist doch eine normale Division?

Integer-Division. Das Ergebnis ist auch ein Integer und wird
in Richtung Null abgerundet.

gfortran warnt da sogar dazu:

$ cat a.f90
program main
print *,2/3
end program main
$ gfortran -Wall a.f90
a.f90:2:11:

print *,2/3
1
Warning: Integer division truncated to constant »0« at (1) [-Winteger-division]

Ich sehe gerade, dass Pascal dazu den eigenen div-Operator hat.
Nicht verkehrt.

> Du bringst mich aber auf eine Idee, ich könnte mal meine ziemlich
> verstaubten Fortran-Kenntnisse auskramen. Ist ja eigentlich genau für
> Fortran prädestiniert.

:-)

G.B.

unread,
Oct 20, 2016, 3:32:08 PM10/20/16
to
On 19.10.16 18:09, Volker Englisch wrote:
> Jetzt stehe ich auf dem Schlauch. Warum sollte 2/3 gleich Null sein?
> Ist doch eine normale Division?

Bei Ganzzahlen steht p/q in vielen Sprachen für Teilen mit Rest.
Demnach ist die Frage: Wie viele Vielfache von 3 sind in 2 enthalten?

Thomas Koenig

unread,
Oct 26, 2016, 4:15:22 PM10/26/16
to
Volker Englisch <lrz...@rsli.de> schrieb:
> Thomas Koenig schrieb:
>> Volker Englisch <lrz...@rsli.de> schrieb:
>>> Du bringst mich aber auf eine Idee, ich könnte mal meine ziemlich
>>> verstaubten Fortran-Kenntnisse auskramen. Ist ja eigentlich genau für
>>> Fortran prädestiniert.
>>
>> :-)
>
> Done. Heraus kam dabei folgendes (mein "Wissen" stammt noch von FORTRAN
> 77, wie man bestimmt sieht. Interessanterweise kommt ein brauchbares
> Ergebnis heraus. Auch wenn der Zweck des Programmes vielleicht etwas
> strange rüberkommt...

$ gfortran -Wall -pedantic foo.f
foo.f:21:17:

CHARACTER*1 H
1
Warning: Obsolescent feature: Old-style character length at (1)

Ist noch in Ordnung, heißt mittlerweile character(len=1)

foo.f:25:17:

READ(*,'(A)$') H
1
Warning: Extraneous characters in format at (1)

Beim Einlesen geht ein Dollarzeichen als "nicht zur nächsten
Zeile springen" nicht. In mordernem Fortran könnte
man ADVANCE="NO" verwenden.

[...]

foo.f:52:52:

500 FORMAT('GEBEN SIE DIE MASSE DES EIS EIN: ', $)
1
Warning: GNU Extension: $ descriptor at (1)

Auch das macht man mittlerweile mit ADVANCE="NO"

foo.f:47:12:

SEK = (T - MIN) * 100.
1
Warning: Possible change of value in conversion from REAL(4) to
INTEGER(4) at (1) [-Wconversion]

SEK ist Integer, das andere ist Real. Könnte so gemeint sein,
wie ist es mit der Rundung?

foo.f:49:18:

WRITE(*,510), MIN
1
Warning: Legacy Extension: Comma before i/o item list at (1)

Das Komma gehört da nicht hin.

Ansonsten: Sieht schon ganz gut aus :-)

G.B.

unread,
Oct 27, 2016, 6:59:22 AM10/27/16
to
On 26.10.16 18:57, Volker Englisch wrote:
> Thomas Koenig schrieb:
>> Volker Englisch <lrz...@rsli.de> schrieb:
>>> Du bringst mich aber auf eine Idee, ich könnte mal meine ziemlich
>>> verstaubten Fortran-Kenntnisse auskramen. Ist ja eigentlich genau für
>>> Fortran prädestiniert.
>>
>> :-)
>
> Done. Heraus kam dabei folgendes (mein "Wissen" stammt noch von FORTRAN
> 77, wie man bestimmt sieht. Interessanterweise kommt ein brauchbares
> Ergebnis heraus. Auch wenn der Zweck des Programmes vielleicht etwas
> strange rüberkommt...
>

So jugendlichen Dialekte.

(Ich sollte eine App draus machen, mit einstellbaren "Eier Fertig!"-Sound.
Dazu eine revolutionäre Gewichts-Sensorik, hergestellt aus einem
neuen, fantastisch durchsichtigen, piezoelektrischen Material.
Man legt es auf den Bildschirm des Smartphones, darauf das Ei,
zum wiegen per kapazitiver Übertragung.)

Alte Skriptingsprache:

* PROGRAM EI
*
* ******************************************************************
* BERECHNUNG DER KOCHDAUER EINES HÜHNEREIS
* ANHAND SEINER MASSE IN GRAMM
* ******************************************************************
*
* TS = SIEDETEMPERATUR DES WASSERS
* T = ZEIT IN MINUTEN
* HOEHE = STANDORTHOEHE UEBER MEERESSPIEGEL
* M = MASSE
* TK = TEMPERATUR ZU BEGINN
* TI = TEMPERATUR ZU ENDE
* MIN = MINUTEN
* SEK = SEKUNDEN
* H = HAERTE
*
DEFINE('HOEHE()'); DEFINE('TK()')
DIGIT = "1234567890"
OUTPUT(.PROMPT,11, 'TW', '-') :(FORMAT)
*
L100 PROMPT = $'530'
H = TRIM(INPUT)
IDENT(H) :S(END)
H POS(0) ANY("123") RPOS(0) :S<CODE(' :(TI' H ')')>
TERMINAL = $'540'
TI = 0 :(TI)
TI1 TI = 62 :(TI)
TI2 TI = 67 :(TI)
TI3 TI = 82 :(TI)
TI EQ(TI, 0) :S(L100)
*
PROMPT = $'500'
INPUT POS(0) SPAN(DIGIT) . M :F(L100)
*
TS = 100. - (HOEHE() / 285.)
T = 0.465 * (M ** (2. / 3.)) * LOG(0.76 * ((TS - TK()) / (TS - TI)))
*
MIN = CONVERT(T, 'INTEGER')
SEK = (T - MIN) * 100.
SEK = CONVERT((SEK * 60. / 100.) + 0.5, 'INTEGER')
OUTPUT = $'510' LPAD(MIN, 2)
OUTPUT = $'520' LPAD(SEK, 2) :(END)
*
FORMAT $'500' = 'GEBEN SIE DIE MASSE DES EIS EIN: '
$'510' = 'MINUTEN .......................: '
$'520' = 'SEKUNDEN ......................: '
$'530' = '1=FLÜSSIG, 2=WEICH, 3=HART ....: '
$'540' = 'UNGÜLTIGE EINGABE'
+ :(L100)
*
HOEHE HOEHE = 405 :(RETURN)
TK TK = 8 :(RETURN)

END


G.B.

unread,
Oct 27, 2016, 1:13:37 PM10/27/16
to
On 27.10.16 18:46, Volker Englisch wrote:

>> Alte Skriptingsprache:
>>
>> DEFINE('HOEHE()'); DEFINE('TK()')
>> DIGIT = "1234567890"
>> OUTPUT(.PROMPT,11, 'TW', '-') :(FORMAT)
>
> Die Notation erinnert mich an irgendetwas, ich komme nur nicht drauf,
> an was. ALGOL? Wäre aber keine Scriptingsprache.

SNOBOL-4 8->


Thomas Koenig

unread,
Oct 27, 2016, 1:37:39 PM10/27/16
to
Volker Englisch <lrz...@rsli.de> schrieb:
> Thomas Koenig schrieb:
>> Volker Englisch <lrz...@rsli.de> schrieb:
>>> Thomas Koenig schrieb:
>>>> Volker Englisch <lrz...@rsli.de> schrieb:
>>>>> Du bringst mich aber auf eine Idee, ich könnte mal meine ziemlich
>>>>> verstaubten Fortran-Kenntnisse auskramen. Ist ja eigentlich genau für
>>>>> Fortran prädestiniert.
>>>>
>>>> :-)
>>>
>>> Done. Heraus kam dabei folgendes (mein "Wissen" stammt noch von FORTRAN
>>> 77, wie man bestimmt sieht. Interessanterweise kommt ein brauchbares
>>> Ergebnis heraus. Auch wenn der Zweck des Programmes vielleicht etwas
>>> strange rüberkommt...
>>
>> $ gfortran -Wall -pedantic foo.f
>
> Interessant. Mein f95 hat alles geschluckt...
>
>> READ(*,'(A)$') H
>> Beim Einlesen geht ein Dollarzeichen als "nicht zur nächsten
>> Zeile springen" nicht. In mordernem Fortran könnte
>> man ADVANCE="NO" verwenden.
>
> Stimmt. Ich habe leider kein gfortran.

gfortran ist i.d.R. bei Linux- Distributionen dabei,
meist als separates Paket.

Unter Windows funktioniert cygwin ganz gut, mit mingw habe
ich eher gemischte Erfahrungen.


>Hätte es den Fehler ohne
> -pedantic geschluckt?

Mit der gleichen Warnung.


>
>> 500 FORMAT('GEBEN SIE DIE MASSE DES EIS EIN: ', $)
>> 1
>> Warning: GNU Extension: $ descriptor at (1)
>
> Hilfe :-) Ich hätte geschworen, dass ich das schon zu Zeiten so codiert
> habe, als es GNU noch gar nicht gab. Naja, errare humanum est...

Ist streng genommen auch keine GNU-Erweiterung, sondern eine
Erweiterung, die gfortran von anderen Compilern übernommen hat.
Wird dann als "GNU extension" bezeichnet.

>> foo.f:49:18:
>>
>> WRITE(*,510), MIN
>> 1
>> Warning: Legacy Extension: Comma before i/o item list at (1)
>>
>> Das Komma gehört da nicht hin.
>
> Stimmt. Aber auch da hat f95 nicht gemotzt.

Was für einer isses denn?

Thomas Koenig

unread,
Oct 28, 2016, 1:29:58 PM10/28/16
to
Volker Englisch <lrz...@rsli.de> schrieb:
> Thomas Koenig schrieb:

>>> Hilfe :-) Ich hätte geschworen, dass ich das schon zu Zeiten so codiert
>>> habe, als es GNU noch gar nicht gab. Naja, errare humanum est...
>>
>> Ist streng genommen auch keine GNU-Erweiterung, sondern eine
>> Erweiterung, die gfortran von anderen Compilern übernommen hat.
>> Wird dann als "GNU extension" bezeichnet.
>
> Wie hat man das in FORTRAN 77 ohne die Extension codiert? Gar nicht?

Gar nicht, deshalb gab es ja diese (durchaus weit verbreitete)
Erweiterung :-)


>
>>> Stimmt. Aber auch da hat f95 nicht gemotzt.
>>
>> Was für einer isses denn?
>
> G95 (GCC 4.0.3 (g95 0.92!) Jan 31 2011)
> Copyright (C) 2002-2008 Free Software Foundation, Inc.

Naja, g95 ist seit Ewigkeiten (siehe Erscheinungsjahr) nicht mehr
unterstützt. gfortran ist mittlerweile deutlich besser.

Allerdings spricht auch nix dagegen, Code durch verschiedene
Compiler zu jagen, wenn man sie zur Verfügung hat. Irgendeiner
davon spuckt typischerweise noch eine sinnvolle oder nützliche
Warnung aus.

G.B.

unread,
Oct 29, 2016, 9:31:38 AM10/29/16
to
On 28.10.16 18:25, Volker Englisch wrote:
> G.B. schrieb:
> Wow. Dazu musste ich jetzt erst mal googeln. Interessante Sprache. Hast
> Du die PDP-10 etwa noch kennen gelernt?

Kein bisschen. Nur festgestellt, dass die ein oder andere
ziemlich gute Idee als Folge der Vorhersagbarkeiten der
menschlichen Kaufmannsnatur den Gang alles teuren gegangen ist.
Bei SNOBOL-4 soll die unzeitgemäße Steuersyntax auch eine
Rolle gespielt haben.
0 new messages