--- a/FloatArray.st Mon Aug 29 11:06:09 2016 +0200
+++ b/FloatArray.st Tue Aug 30 17:19:53 2016 +0200
@@ -2,7 +2,7 @@
"
COPYRIGHT (c) 1993 by Claus Gittinger
- All Rights Reserved
+ All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
@@ -16,10 +16,10 @@
"{ NameSpace: Smalltalk }"
AbstractNumberVector variableFloatSubclass:#FloatArray
- instanceVariableNames:''
- classVariableNames:''
- poolDictionaries:''
- category:'Collections-Arrayed'
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Collections-Arrayed'
!
!FloatArray class methodsFor:'documentation'!
@@ -27,7 +27,7 @@
copyright
"
COPYRIGHT (c) 1993 by Claus Gittinger
- All Rights Reserved
+ All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
@@ -46,16 +46,18 @@
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
"
! !
+
+
!FloatArray class methodsFor:'queries'!
elementByteSize
@@ -67,6 +69,7 @@
"Created: / 15-09-2011 / 14:12:39 / cg"
! !
+
!FloatArray methodsFor:'copying'!
clone
@@ -77,13 +80,13 @@
newArr := self class new:(self size).
%{
if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
- INT _sz = __floatArraySize(self);
+ INT _sz = __floatArraySize(self);
- bcopy(__FloatArrayInstPtr(self)->f_element,
- __FloatArrayInstPtr(newArr)->f_element,
- sizeof(float) * _sz);
+ bcopy(__FloatArrayInstPtr(self)->f_element,
+ __FloatArrayInstPtr(newArr)->f_element,
+ sizeof(float) * _sz);
- RETURN (newArr);
+ RETURN (newArr);
}
%}.
newArr replaceFrom:1 to:self size with:self startingAt:1.
@@ -102,37 +105,37 @@
%{
if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
- if (__bothSmallInteger(start, stop)) {
- INT __start = __intVal(start) - 1;
- INT __stop = __intVal(stop) - 1 ;
+ if (__bothSmallInteger(start, stop)) {
+ INT __start = __intVal(start) - 1;
+ INT __stop = __intVal(stop) - 1 ;
- if (__stop >= __start) {
- INT __sz = __floatArraySize(self);
- // printf("o_size=%d floatArraySize=%d\n", __qSize(self), __sz);
+ if (__stop >= __start) {
+ INT __sz = __floatArraySize(self);
+ // printf("o_size=%d floatArraySize=%d\n", __qSize(self), __sz);
- if (((unsigned INT)__start < __sz)
- && ((unsigned INT)__stop < __sz)) {
- INT __n = __stop - __start + 1;
- OBJ __nObj;
- int nBytes;
+ if (((unsigned INT)__start < __sz)
+ && ((unsigned INT)__stop < __sz)) {
+ INT __n = __stop - __start + 1;
+ OBJ __nObj;
+ int nBytes;
- // don't do this; sizeof returns the padded size!
- // nBytes = sizeof(struct __FloatArray) + (__n - 1) * sizeof(float);
- nBytes = OHDR_SIZE + (__n * sizeof(float));
+ // don't do this; sizeof returns the padded size!
+ // nBytes = sizeof(struct __FloatArray) + (__n - 1) * sizeof(float);
+ nBytes = OHDR_SIZE + (__n * sizeof(float));
- // printf("__n=%d nBytes=%d\n", __n, nBytes);
- __nObj = __STX___new(nBytes);
- if (__nObj != nil) {
- __objPtr(__nObj)->o_class = __qClass(self);
- __STORE(__nObj, __qClass(self));
- bcopy(__FloatArrayInstPtr(self)->f_element + __start,
- __FloatArrayInstPtr(__nObj)->f_element,
- sizeof(float) * __n);
- RETURN(__nObj);
- }
- }
- }
- }
+ // printf("__n=%d nBytes=%d\n", __n, nBytes);
+ __nObj = __STX___new(nBytes);
+ if (__nObj != nil) {
+ __objPtr(__nObj)->o_class = __qClass(self);
+ __STORE(__nObj, __qClass(self));
+ bcopy(__FloatArrayInstPtr(self)->f_element + __start,
+ __FloatArrayInstPtr(__nObj)->f_element,
+ sizeof(float) * __n);
+ RETURN(__nObj);
+ }
+ }
+ }
+ }
}
%}.
^ super copyFrom:start to:stop
@@ -149,38 +152,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
@@ -201,27 +204,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
@@ -245,29 +248,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
@@ -287,32 +290,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: ;
%}.
@@ -339,29 +342,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
@@ -383,32 +386,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: ;
%}.
@@ -437,28 +440,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
@@ -478,32 +481,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: ;
%}.
@@ -527,23 +530,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
@@ -567,28 +570,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
@@ -610,32 +613,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: ;
%}.
@@ -668,163 +671,69 @@
^ anObject isNumber
!
-max
- "return the largest element;
- redefined for speed"
-%{
- if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
- INT _sz = __floatArraySize(self);
-
- if (_sz > 0) {
- float *_p = __FloatArrayInstPtr(self)->f_element;
- float _max;
-
- _max = _p[0];
- if (_sz > 1) {
- INT _i;
- float _prev, _this;
-
- /* how about inline-mmx-asm for this ... */
- _this = _p[1];
- for (_i=2; _i<_sz; _i++) {
- _prev = _this;
- _this = _p[_i];
- if (_prev > _max) _max = _prev;
- }
- if (_this > _max) _max = _this;
- }
- RETURN (__MKFLOAT(_max));
- }
- }
-%}.
- ^ super max
-
- "
- |f1|
-
- f1 := (1 to:1000) asFloatArray.
- Time millisecondsToRun:[ 1000 timesRepeat:[ f1 max ] ]
- "
- "
- |f1|
-
- f1 := FloatArray withAll:#(1 2 3 4 5).
- f1 max
- "
- "
- |f1|
-
- f1 := FloatArray withAll:#(5 4 3 2 1).
- f1 max
- "
-!
-
-min
- "return the smallest element;
- redefined for speed"
-%{
- if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
- INT _sz = __floatArraySize(self);
-
- if (_sz > 0) {
- float *_p = __FloatArrayInstPtr(self)->f_element;
- float _min;
-
- _min = _p[0];
- if (_sz > 1) {
- INT _i;
- float _prev, _this;
-
- /* how about inline-mmx-asm for this ... */
- _this = _p[1];
- for (_i=2; _i<_sz; _i++) {
- _prev = _this;
- _this = _p[_i];
- if (_prev < _min) _min = _prev;
- }
- if (_this < _min) _min = _this;
- }
- RETURN (__MKFLOAT(_min));
- }
- }
-%}.
- ^ super min
-
- "
- |f1|
-
- f1 := (1 to:1000) asFloatArray.
- Time millisecondsToRun:[ 1000 timesRepeat:[ f1 min ] ]
- "
- "
- |f1|
-
- f1 := FloatArray withAll:#(1 2 3 4 5).
- f1 min
- "
- "
- |f1|
-
- f1 := FloatArray withAll:#(5 4 3 2 1).
- f1 min
- "
-!
-
minMax
"return a Tuple holding the smallest and largest element;
redefined for speed"
- |min max|
+ |min max empty|
%{
if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
- INT _sz = __floatArraySize(self);
- if (_sz > 0) {
- INT _i;
- float *_p = __FloatArrayInstPtr(self)->f_element;
- float _min, _max;
-
- _min = _max = _p[0];
+ INT _sz = __floatArraySize(self);
+
+ if (_sz > 0) {
+ INT _i;
+ float *_p = __FloatArrayInstPtr(self)->f_element;
+ float _min, _max;
+ OBJ retVal;
+
+ _min = _max = _p[0];
#ifdef PRE_4_OCT_2011
- if (_sz > 1) {
- float _this = _p[1];
- float _prev;
+ if (_sz > 1) {
+ float _this = _p[1];
+ float _prev;
- /* how about inline-mmx-asm for this ... */
- for (_i=2; _i<_sz; _i++) {
- _prev = _this;
- _this = _p[_i];
- if (_prev < _min) {
- _min = _prev;
- } else if (_prev > _max) {
- _max = _prev;
- }
- }
- if (_this < _min) {
- _min = _this;
- } else if (_this > _max) {
- _max = _this;
- }
- }
+ /* how about inline-mmx-asm for this ... */
+ for (_i=2; _i<_sz; _i++) {
+ _prev = _this;
+ _this = _p[_i];
+ if (_prev < _min) {
+ _min = _prev;
+ } else if (_prev > _max) {
+ _max = _prev;
+ }
+ }
+ if (_this < _min) {
+ _min = _this;
+ } else if (_this > _max) {
+ _max = _this;
+ }
+ }
#else
- for (_i=_sz-1; _i>0; _i-=2) {
- float _v1 = _p[_i];
- float _v2 = _p[_i-1];
- if (_v1 < _v2) {
- if (_v1 < _min) _min = _v1;
- if (_v2 > _max) _max = _v2;
- } else {
- if (_v2 < _min) _min = _v2;
- if (_v1 > _max) _max = _v1;
- }
- }
+ for (_i=_sz-1; _i>0; _i-=2) {
+ float _v1 = _p[_i];
+ float _v2 = _p[_i-1];
+ if (_v1 < _v2) {
+ if (_v1 < _min) _min = _v1;
+ if (_v2 > _max) _max = _v2;
+ } else {
+ if (_v2 < _min) _min = _v2;
+ if (_v1 > _max) _max = _v1;
+ }
+ }
#endif
- min = __MKFLOAT(_min);
- max = __MKFLOAT(_max);
- RETURN (__ARRAY_WITH2(min, max));
- }
+ min = __MKFLOAT(_min);
+ __PROTECT__(min);
+ max = __MKFLOAT(_max);
+ __UNPROTECT__(min);
+ RETURN (__ARRAY_WITH2(min, max));
+ }
+ empty = true;
}
%}.
+ empty == true ifTrue:[
+ ^ self emptyCollectionError.
+ ].
^ Array with:(super min) with:(super max)
"
@@ -842,6 +751,12 @@
"
|f1|
+ f1 := FloatArray withAll:#(1 2 3 4).
+ f1 minMax
+ "
+ "
+ |f1|
+
f1 := FloatArray withAll:#(5 4 3 2 1).
f1 minMax
"
@@ -865,37 +780,37 @@
%{
if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
&& (__ClassInstPtr(__qClass(aFloatVector))->c_ninstvars == __mkSmallInteger(0))) {
- INT __mySize = __floatArraySize(self);
- double __result = 0.0;
- float *__p1 = __FloatArrayInstPtr(self)->f_element;
+ INT __mySize = __floatArraySize(self);
+ double __result = 0.0;
+ float *__p1 = __FloatArrayInstPtr(self)->f_element;
- if (__mySize > 0) {
- if (__isFloats(aFloatVector)) {
- INT __otherSize = __floatArraySize(aFloatVector);
+ if (__mySize > 0) {
+ if (__isFloats(aFloatVector)) {
+ INT __otherSize = __floatArraySize(aFloatVector);
- if (__mySize == __otherSize) {
- 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));
- }
- } else if (__isDoubles(aFloatVector)) {
- INT __otherSize = __doubleArraySize(aFloatVector);
+ if (__mySize == __otherSize) {
+ 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));
+ }
+ } else if (__isDoubles(aFloatVector)) {
+ INT __otherSize = __doubleArraySize(aFloatVector);
- if (__mySize == __otherSize) {
- double *__p2 = __DoubleArrayInstPtr(aFloatVector)->d_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) {
+ double *__p2 = __DoubleArrayInstPtr(aFloatVector)->d_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
@@ -950,9 +865,9 @@
v1 := Array new:10000 withAll:2.
v2 := Array new:10000 withAll:3.
Time millisecondsToRun:[
- 10000 timesRepeat:[
- v1 dot:v2.
- ]
+ 10000 timesRepeat:[
+ v1 dot:v2.
+ ]
]
"
"
@@ -961,9 +876,9 @@
v1 := FloatArray new:10000 withAll:2.
v2 := FloatArray new:10000 withAll:3.
Time millisecondsToRun:[
- 10000 timesRepeat:[
- v1 dot:v2.
- ]
+ 10000 timesRepeat:[
+ v1 dot:v2.
+ ]
]
"
@@ -981,7 +896,7 @@
hornerMultiplyAndAdd:x
"primitive support for horner's-method computation of polynomials.
The vector is interpreted as providing the factors for a polynomial,
- an*x^n + (an-1)*x^(n-1) + ... + a2(x) + a1
+ an*x^n + (an-1)*x^(n-1) + ... + a2(x) + a1
where the ai are the elements of the Array.
The highest rank factor is at the first position, the 0-rank constant at last.
This is inlined c-code, which may get compiled to fast machine code,
@@ -993,28 +908,28 @@
double __x;
if (__isFloat(x)) {
- __x = __floatVal(x);
+ __x = __floatVal(x);
} else if (__isShortFloat(x)) {
- __x = (double)__shortFloatVal(x);
+ __x = (double)__shortFloatVal(x);
} else if (__isSmallInteger(x)) {
- __x = (double)(__intVal(x));
+ __x = (double)(__intVal(x));
} else {
- goto getOutOfHere;
+ goto getOutOfHere;
}
if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
- INT __mySize = __floatArraySize(self);
- float *__elements = __FloatArrayInstPtr(self)->f_element;
- double __result = __elements[0];
+ INT __mySize = __floatArraySize(self);
+ float *__elements = __FloatArrayInstPtr(self)->f_element;
+ double __result = __elements[0];
- if (__mySize > 1) {
- INT __i;
- /* how about inline-mmx-asm for this ... */
- for (__i=1; __i<__mySize; __i++) {
- __result = (__result * __x) + __elements[__i];
- }
- }
- RETURN (__MKFLOAT(__result));
+ if (__mySize > 1) {
+ INT __i;
+ /* how about inline-mmx-asm for this ... */
+ for (__i=1; __i<__mySize; __i++) {
+ __result = (__result * __x) + __elements[__i];
+ }
+ }
+ RETURN (__MKFLOAT(__result));
}
getOutOfHere: ;
%}.
@@ -1036,23 +951,24 @@
|v|
v := Array new:100 withAll:2.0.
Time millisecondsToRun:[
- 10000 timesRepeat:[ v hornerMultiplyAndAdd:10]
+ 10000 timesRepeat:[ v hornerMultiplyAndAdd:10]
]
|v|
v := FloatArray new:100 withAll:2.
Time millisecondsToRun:[
- 10000 timesRepeat:[ v hornerMultiplyAndAdd:10]
+ 10000 timesRepeat:[ v hornerMultiplyAndAdd:10]
]
|v|
v := DoubleArray new:100 withAll:2.
Time millisecondsToRun:[
- 10000 timesRepeat:[ v hornerMultiplyAndAdd:10]
+ 10000 timesRepeat:[ v hornerMultiplyAndAdd:10]
]
"
! !
+
!FloatArray class methodsFor:'documentation'!
version