--- a/FloatArray.st Wed Dec 23 10:52:10 2015 +0100
+++ b/FloatArray.st Mon Dec 28 22:53:57 2015 +0100
@@ -42,17 +42,17 @@
"
FloatArrays store floats (and nothing else).
They have been added to support heavy duty number crunching and
- data exchange with openGL frameworks and other mass data libraries.
+ data exchange with openGL frameworks and other mass data libraries.
See documentation in DoubleArray for more information.
[memory requirements:]
- OBJ-HEADER + (size * float-size)
+ OBJ-HEADER + (size * float-size)
[See also:]
- DoubleArray Array
+ DoubleArray Array
[author:]
- Claus Gittinger
+ Claus Gittinger
"
! !
@@ -142,38 +142,38 @@
replaceFrom:start to:stop with:aCollection startingAt:replStart
%{
if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
- && __isFloats(aCollection)
- && (__ClassInstPtr(__qClass(aCollection))->c_ninstvars == __mkSmallInteger(0))
- && __bothSmallInteger(start, stop)
- && __isSmallInteger(replStart)
+ && __isFloats(aCollection)
+ && (__ClassInstPtr(__qClass(aCollection))->c_ninstvars == __mkSmallInteger(0))
+ && __bothSmallInteger(start, stop)
+ && __isSmallInteger(replStart)
) {
- INT __start = __intVal(start) - 1;
- INT __stop = __intVal(stop) - 1 ;
- INT __replStart = __intVal(replStart) - 1 ;
+ INT __start = __intVal(start) - 1;
+ INT __stop = __intVal(stop) - 1 ;
+ INT __replStart = __intVal(replStart) - 1 ;
- if (__stop >= __start) {
- INT __sz = __floatArraySize(self);
- INT __otherSz = __floatArraySize(aCollection);
- INT __replStop = __replStart + (__stop-__start);
+ if (__stop >= __start) {
+ INT __sz = __floatArraySize(self);
+ INT __otherSz = __floatArraySize(aCollection);
+ INT __replStop = __replStart + (__stop-__start);
- if (((unsigned INT)__start < __sz)
- && ((unsigned INT)__stop < __sz)
- && ((unsigned INT)__replStart < __otherSz)
- && ((unsigned INT)__replStop < __otherSz)) {
- INT __n = __stop - __start + 1;
+ if (((unsigned INT)__start < __sz)
+ && ((unsigned INT)__stop < __sz)
+ && ((unsigned INT)__replStart < __otherSz)
+ && ((unsigned INT)__replStop < __otherSz)) {
+ INT __n = __stop - __start + 1;
- if (aCollection == self) {
- memmove(&(__FloatArrayInstPtr(self)->f_element[__start]),
- &(__FloatArrayInstPtr(aCollection)->f_element[__replStart]),
- sizeof(float) * __n);
- } else {
- memcpy(&(__FloatArrayInstPtr(self)->f_element[__start]),
- &(__FloatArrayInstPtr(aCollection)->f_element[__replStart]),
- sizeof(float) * __n);
- }
- RETURN(self);
- }
- }
+ if (aCollection == self) {
+ memmove(&(__FloatArrayInstPtr(self)->f_element[__start]),
+ &(__FloatArrayInstPtr(aCollection)->f_element[__replStart]),
+ sizeof(float) * __n);
+ } else {
+ memcpy(&(__FloatArrayInstPtr(self)->f_element[__start]),
+ &(__FloatArrayInstPtr(aCollection)->f_element[__replStart]),
+ sizeof(float) * __n);
+ }
+ RETURN(self);
+ }
+ }
}
%}.
^ super replaceFrom:start to:stop with:aCollection startingAt:replStart
@@ -194,27 +194,27 @@
%{
if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
- INT _sz = __floatArraySize(self);
- INT i;
- float *_p = __FloatArrayInstPtr(self)->f_element;
- float prev_p;
+ INT _sz = __floatArraySize(self);
+ INT i;
+ float *_p = __FloatArrayInstPtr(self)->f_element;
+ float prev_p;
- if (_sz > 0) {
- /* how about inline-mmx-asm for this ... */
- prev_p = _p[0];
- for (i=1; i<_sz; i++) {
- float next_p = _p[i];
+ if (_sz > 0) {
+ /* how about inline-mmx-asm for this ... */
+ prev_p = _p[0];
+ for (i=1; i<_sz; i++) {
+ float next_p = _p[i];
- if (prev_p < 0) {
- _p[i-1] = -prev_p;
- }
- prev_p = next_p;
- }
- if (prev_p < 0) {
- _p[i-1] = -prev_p;
- }
- }
- RETURN (self);
+ if (prev_p < 0) {
+ _p[i-1] = -prev_p;
+ }
+ prev_p = next_p;
+ }
+ if (prev_p < 0) {
+ _p[i-1] = -prev_p;
+ }
+ }
+ RETURN (self);
}
%}.
super primAbs
@@ -238,29 +238,29 @@
if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
&& __isFloats(floatArray)
&& (__ClassInstPtr(__qClass(floatArray))->c_ninstvars == __mkSmallInteger(0))) {
- INT _sz1 = __floatArraySize(self);
- INT _sz2 = __floatArraySize(floatArray);
- INT i;
- float *_p1 = __FloatArrayInstPtr(self)->f_element;
- float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
+ INT _sz1 = __floatArraySize(self);
+ INT _sz2 = __floatArraySize(floatArray);
+ INT i;
+ float *_p1 = __FloatArrayInstPtr(self)->f_element;
+ float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
- if (_sz1 > 0) {
- if (_sz2 >= _sz1) {
- /* how about inline-mmx-asm for this ... */
- float prev_p1 = _p1[0];
- float prev_p2 = _p2[0];
+ if (_sz1 > 0) {
+ if (_sz2 >= _sz1) {
+ /* how about inline-mmx-asm for this ... */
+ float prev_p1 = _p1[0];
+ float prev_p2 = _p2[0];
- for (i=1; i<_sz1; i++) {
- float next_p1 = _p1[i];
- float next_p2 = _p2[i];
- _p1[i-1] = prev_p1 + prev_p2;
- prev_p1 = next_p1;
- prev_p2 = next_p2;
- }
- _p1[i-1] = prev_p1 + prev_p2;
- }
- }
- RETURN (self);
+ for (i=1; i<_sz1; i++) {
+ float next_p1 = _p1[i];
+ float next_p2 = _p2[i];
+ _p1[i-1] = prev_p1 + prev_p2;
+ prev_p1 = next_p1;
+ prev_p2 = next_p2;
+ }
+ _p1[i-1] = prev_p1 + prev_p2;
+ }
+ }
+ RETURN (self);
}
%}.
super primAddArray:floatArray
@@ -280,32 +280,32 @@
%{
if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
- INT _sz1 = __floatArraySize(self);
- INT i;
- float *_p1 = __FloatArrayInstPtr(self)->f_element;
- float v;
- float prev_p1;
+ INT _sz1 = __floatArraySize(self);
+ INT i;
+ float *_p1 = __FloatArrayInstPtr(self)->f_element;
+ float v;
+ float prev_p1;
- if (_sz1 > 0) {
- if (__isFloat(aScalar)) {
- v = (float)(__floatVal(aScalar));
- } else if (__isShortFloat(aScalar)) {
- v = __shortFloatVal(aScalar);
- } else if (__isSmallInteger(aScalar)) {
- v = (float)(__intVal(aScalar));
- } else
- goto badArg;
+ if (_sz1 > 0) {
+ if (__isFloat(aScalar)) {
+ v = (float)(__floatVal(aScalar));
+ } else if (__isShortFloat(aScalar)) {
+ v = __shortFloatVal(aScalar);
+ } else if (__isSmallInteger(aScalar)) {
+ v = (float)(__intVal(aScalar));
+ } else
+ goto badArg;
- /* how about inline-mmx-asm for this ... */
- prev_p1 = _p1[0];
- for (i=1; i<_sz1; i++) {
- float next_p1 = _p1[i];
- _p1[i-1] = prev_p1 + v;
- prev_p1 = next_p1;
- }
- _p1[i-1] = prev_p1 + v;
- }
- RETURN (self);
+ /* how about inline-mmx-asm for this ... */
+ prev_p1 = _p1[0];
+ for (i=1; i<_sz1; i++) {
+ float next_p1 = _p1[i];
+ _p1[i-1] = prev_p1 + v;
+ prev_p1 = next_p1;
+ }
+ _p1[i-1] = prev_p1 + v;
+ }
+ RETURN (self);
}
badArg: ;
%}.
@@ -332,29 +332,29 @@
if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
&& __isFloats(floatArray)
&& (__ClassInstPtr(__qClass(floatArray))->c_ninstvars == __mkSmallInteger(0))) {
- INT _sz1 = __floatArraySize(self);
- INT _sz2 = __floatArraySize(floatArray);
- INT i;
- float *_p1 = __FloatArrayInstPtr(self)->f_element;
- float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
+ INT _sz1 = __floatArraySize(self);
+ INT _sz2 = __floatArraySize(floatArray);
+ INT i;
+ float *_p1 = __FloatArrayInstPtr(self)->f_element;
+ float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
- if (_sz1 > 0) {
- if (_sz2 >= _sz1) {
- /* how about inline-mmx-asm for this ... */
- float prev_p1 = _p1[0];
- float prev_p2 = _p2[0];
+ if (_sz1 > 0) {
+ if (_sz2 >= _sz1) {
+ /* how about inline-mmx-asm for this ... */
+ float prev_p1 = _p1[0];
+ float prev_p2 = _p2[0];
- for (i=1; i<_sz1; i++) {
- float next_p1 = _p1[i];
- float next_p2 = _p2[i];
- _p1[i-1] = prev_p1 / prev_p2;
- prev_p1 = next_p1;
- prev_p2 = next_p2;
- }
- _p1[i-1] = prev_p1 / prev_p2;
- }
- }
- RETURN (self);
+ for (i=1; i<_sz1; i++) {
+ float next_p1 = _p1[i];
+ float next_p2 = _p2[i];
+ _p1[i-1] = prev_p1 / prev_p2;
+ prev_p1 = next_p1;
+ prev_p2 = next_p2;
+ }
+ _p1[i-1] = prev_p1 / prev_p2;
+ }
+ }
+ RETURN (self);
}
%}.
super primDivArray: floatArray
@@ -376,32 +376,32 @@
%{
if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
- INT _sz1 = __floatArraySize(self);
- INT i;
- float *_p1 = __FloatArrayInstPtr(self)->f_element;
- float v;
- float prev_p1;
+ INT _sz1 = __floatArraySize(self);
+ INT i;
+ float *_p1 = __FloatArrayInstPtr(self)->f_element;
+ float v;
+ float prev_p1;
- if (_sz1 > 0) {
- if (__isFloat(aScalar)) {
- v = (float)(__floatVal(aScalar));
- } else if (__isShortFloat(aScalar)) {
- v = __shortFloatVal(aScalar);
- } else if (__isSmallInteger(aScalar)) {
- v = (float)(__intVal(aScalar));
- } else
- goto badArg;
+ if (_sz1 > 0) {
+ if (__isFloat(aScalar)) {
+ v = (float)(__floatVal(aScalar));
+ } else if (__isShortFloat(aScalar)) {
+ v = __shortFloatVal(aScalar);
+ } else if (__isSmallInteger(aScalar)) {
+ v = (float)(__intVal(aScalar));
+ } else
+ goto badArg;
- /* how about inline-mmx-asm for this ... */
- prev_p1 = _p1[0];
- for (i=1; i<_sz1; i++) {
- float next_p1 = _p1[i];
- _p1[i-1] = prev_p1 / v;
- prev_p1 = next_p1;
- }
- _p1[i-1] = prev_p1 / v;
- }
- RETURN (self);
+ /* how about inline-mmx-asm for this ... */
+ prev_p1 = _p1[0];
+ for (i=1; i<_sz1; i++) {
+ float next_p1 = _p1[i];
+ _p1[i-1] = prev_p1 / v;
+ prev_p1 = next_p1;
+ }
+ _p1[i-1] = prev_p1 / v;
+ }
+ RETURN (self);
}
badArg: ;
%}.
@@ -430,28 +430,28 @@
if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
&& __isFloats(floatArray)
&& (__ClassInstPtr(__qClass(floatArray))->c_ninstvars == __mkSmallInteger(0))) {
- INT _sz1 = __floatArraySize(self);
- INT _sz2 = __floatArraySize(floatArray);
- INT i;
- float *_p1 = __FloatArrayInstPtr(self)->f_element;
- float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
+ INT _sz1 = __floatArraySize(self);
+ INT _sz2 = __floatArraySize(floatArray);
+ INT i;
+ float *_p1 = __FloatArrayInstPtr(self)->f_element;
+ float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
- if (_sz1 > 0) {
- if (_sz2 >= _sz1) {
- float prev_p1 = _p1[0];
- float prev_p2 = _p2[0];
+ if (_sz1 > 0) {
+ if (_sz2 >= _sz1) {
+ float prev_p1 = _p1[0];
+ float prev_p2 = _p2[0];
- for (i=1; i<_sz1; i++) {
- float next_p1 = _p1[i];
- float next_p2 = _p2[i];
- _p1[i-1] = prev_p1 * prev_p2;
- prev_p1 = next_p1;
- prev_p2 = next_p2;
- }
- _p1[i-1] = prev_p1 * prev_p2;
- }
- }
- RETURN (self);
+ for (i=1; i<_sz1; i++) {
+ float next_p1 = _p1[i];
+ float next_p2 = _p2[i];
+ _p1[i-1] = prev_p1 * prev_p2;
+ prev_p1 = next_p1;
+ prev_p2 = next_p2;
+ }
+ _p1[i-1] = prev_p1 * prev_p2;
+ }
+ }
+ RETURN (self);
}
%}.
super primMulArray: floatArray
@@ -471,32 +471,32 @@
%{
if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
- INT _sz1 = __floatArraySize(self);
- INT i;
- float *_p1 = __FloatArrayInstPtr(self)->f_element;
- float v;
- float prev_p1;
+ INT _sz1 = __floatArraySize(self);
+ INT i;
+ float *_p1 = __FloatArrayInstPtr(self)->f_element;
+ float v;
+ float prev_p1;
- if (_sz1 > 0) {
- if (__isFloat(aScalar)) {
- v = (float)(__floatVal(aScalar));
- } else if (__isShortFloat(aScalar)) {
- v = __shortFloatVal(aScalar);
- } else if (__isSmallInteger(aScalar)) {
- v = (float)(__intVal(aScalar));
- } else
- goto badArg;
+ if (_sz1 > 0) {
+ if (__isFloat(aScalar)) {
+ v = (float)(__floatVal(aScalar));
+ } else if (__isShortFloat(aScalar)) {
+ v = __shortFloatVal(aScalar);
+ } else if (__isSmallInteger(aScalar)) {
+ v = (float)(__intVal(aScalar));
+ } else
+ goto badArg;
- /* how about inline-mmx-asm for this ... */
- prev_p1 = _p1[0];
- for (i=1; i<_sz1; i++) {
- float next_p1 = _p1[i];
- _p1[i-1] = prev_p1 * v;
- prev_p1 = next_p1;
- }
- _p1[i-1] = prev_p1 * v;
- }
- RETURN (self);
+ /* how about inline-mmx-asm for this ... */
+ prev_p1 = _p1[0];
+ for (i=1; i<_sz1; i++) {
+ float next_p1 = _p1[i];
+ _p1[i-1] = prev_p1 * v;
+ prev_p1 = next_p1;
+ }
+ _p1[i-1] = prev_p1 * v;
+ }
+ RETURN (self);
}
badArg: ;
%}.
@@ -520,23 +520,23 @@
%{
if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
- INT _sz = __floatArraySize(self);
- INT i;
- float *_p = __FloatArrayInstPtr(self)->f_element;
- float prev_p;
+ INT _sz = __floatArraySize(self);
+ INT i;
+ float *_p = __FloatArrayInstPtr(self)->f_element;
+ float prev_p;
- if (_sz > 0) {
- /* how about inline-mmx-asm for this ... */
- prev_p = _p[0];
- for (i=1; i<_sz; i++) {
- float next_p = _p[i];
+ if (_sz > 0) {
+ /* how about inline-mmx-asm for this ... */
+ prev_p = _p[0];
+ for (i=1; i<_sz; i++) {
+ float next_p = _p[i];
- _p[i-1] = -prev_p;
- prev_p = next_p;
- }
- _p[i-1] = -prev_p;
- }
- RETURN (self);
+ _p[i-1] = -prev_p;
+ prev_p = next_p;
+ }
+ _p[i-1] = -prev_p;
+ }
+ RETURN (self);
}
%}.
super primNegated
@@ -560,28 +560,28 @@
if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
&& __isFloats(floatArray)
&& (__ClassInstPtr(__qClass(floatArray))->c_ninstvars == __mkSmallInteger(0))) {
- INT _sz1 = __floatArraySize(self);
- INT _sz2 = __floatArraySize(floatArray);
- INT i;
- float *_p1 = __FloatArrayInstPtr(self)->f_element;
- float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
+ INT _sz1 = __floatArraySize(self);
+ INT _sz2 = __floatArraySize(floatArray);
+ INT i;
+ float *_p1 = __FloatArrayInstPtr(self)->f_element;
+ float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
- if (_sz1 > 0) {
- if (_sz2 >= _sz1) {
- float prev_p1 = _p1[0];
- float prev_p2 = _p2[0];
+ if (_sz1 > 0) {
+ if (_sz2 >= _sz1) {
+ float prev_p1 = _p1[0];
+ float prev_p2 = _p2[0];
- for (i=1; i<_sz1; i++) {
- float next_p1 = _p1[i];
- float next_p2 = _p2[i];
- _p1[i-1] = prev_p1 - prev_p2;
- prev_p1 = next_p1;
- prev_p2 = next_p2;
- }
- _p1[i-1] = prev_p1 - prev_p2;
- }
- }
- RETURN (self);
+ for (i=1; i<_sz1; i++) {
+ float next_p1 = _p1[i];
+ float next_p2 = _p2[i];
+ _p1[i-1] = prev_p1 - prev_p2;
+ prev_p1 = next_p1;
+ prev_p2 = next_p2;
+ }
+ _p1[i-1] = prev_p1 - prev_p2;
+ }
+ }
+ RETURN (self);
}
%}.
super primSubtractArray: floatArray
@@ -603,32 +603,32 @@
%{
if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
- INT _sz1 = __floatArraySize(self);
- INT i;
- float *_p1 = __FloatArrayInstPtr(self)->f_element;
- float v;
- float prev_p1;
+ INT _sz1 = __floatArraySize(self);
+ INT i;
+ float *_p1 = __FloatArrayInstPtr(self)->f_element;
+ float v;
+ float prev_p1;
- if (_sz1 > 0) {
- if (__isFloat(aScalar)) {
- v = (float)(__floatVal(aScalar));
- } else if (__isShortFloat(aScalar)) {
- v = __shortFloatVal(aScalar);
- } else if (__isSmallInteger(aScalar)) {
- v = (float)(__intVal(aScalar));
- } else
- goto badArg;
+ if (_sz1 > 0) {
+ if (__isFloat(aScalar)) {
+ v = (float)(__floatVal(aScalar));
+ } else if (__isShortFloat(aScalar)) {
+ v = __shortFloatVal(aScalar);
+ } else if (__isSmallInteger(aScalar)) {
+ v = (float)(__intVal(aScalar));
+ } else
+ goto badArg;
- /* how about inline-mmx-asm for this... ? */
- prev_p1 = _p1[0];
- for (i=1; i<_sz1; i++) {
- float next_p1 = _p1[i];
- _p1[i-1] = prev_p1 - v;
- prev_p1 = next_p1;
- }
- _p1[i-1] = prev_p1 - v;
- }
- RETURN (self);
+ /* how about inline-mmx-asm for this... ? */
+ prev_p1 = _p1[0];
+ for (i=1; i<_sz1; i++) {
+ float next_p1 = _p1[i];
+ _p1[i-1] = prev_p1 - v;
+ prev_p1 = next_p1;
+ }
+ _p1[i-1] = prev_p1 - v;
+ }
+ RETURN (self);
}
badArg: ;
%}.
@@ -707,7 +707,7 @@
!
min
- "return the largest element;
+ "return the smallest element;
redefined for speed"
%{
if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
@@ -853,22 +853,22 @@
if (__isFloats(aFloatVector)
&& (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
&& (__ClassInstPtr(__qClass(aFloatVector))->c_ninstvars == __mkSmallInteger(0))) {
- INT __mySize = __floatArraySize(self);
- INT __otherSize = __floatArraySize(aFloatVector);
- float __result = 0.0;
+ INT __mySize = __floatArraySize(self);
+ INT __otherSize = __floatArraySize(aFloatVector);
+ float __result = 0.0;
- if (__mySize == __otherSize) {
- if (__mySize > 0) {
- float *__p1 = __FloatArrayInstPtr(self)->f_element;
- float *__p2 = __FloatArrayInstPtr(aFloatVector)->f_element;
- INT __i;
- /* how about inline-mmx-asm for this ... */
- for (__i=0; __i<__mySize; __i++) {
- __result += (__p1[__i] * __p2[__i]);
- }
- }
- RETURN (__MKFLOAT(__result));
- }
+ if (__mySize == __otherSize) {
+ if (__mySize > 0) {
+ float *__p1 = __FloatArrayInstPtr(self)->f_element;
+ float *__p2 = __FloatArrayInstPtr(aFloatVector)->f_element;
+ INT __i;
+ /* how about inline-mmx-asm for this ... */
+ for (__i=0; __i<__mySize; __i++) {
+ __result += (__p1[__i] * __p2[__i]);
+ }
+ }
+ RETURN (__MKFLOAT(__result));
+ }
}
%}.
^ super dot:aFloatVector
@@ -877,18 +877,18 @@
|v|
v := #(2.0 2.0 1.0) asFloatArray.
- v dot:v.
+ v dot:v.
"
"
|v1 v2|
v1 := FloatArray new:10000 withAll:2.
- v2 := FloatArray new:10000 withAll:3.
+ v2 := FloatArray new:10000 withAll:3.
Time millisecondsToRun:[
- 10000 timesRepeat:[
- v1 dot:v2.
- ]
- ]
+ 10000 timesRepeat:[
+ v1 dot:v2.
+ ]
+ ]
"
"Created: / 29-05-2007 / 13:13:39 / cg"
@@ -903,4 +903,3 @@
version_CVS
^ '$Header$'
! !
-