473,404 Members | 2,137 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,404 software developers and data experts.

Arithmetic properties of HUGE_VAL and errno

On my system, the following five expressions are true:

(HUGE_VAL == HUGE_VAL / 2)
(1 / HUGE_VAL == 0)
(sqrt(HUGE_VAL) == HUGE_VAL)
(sqrt(-1) == HUGE_VAL)
(sqrt(-HUGE_VAL) == HUGE_VAL)

and

sqrt(HUGE_VAL) doesn't set errno, but sqrt(-1) and sqrt(-HUGE_VAL) do.

Does that all seem right?

--
pete
Nov 15 '05 #1
18 3402

pete wrote:
On my system, the following five expressions are true:

(HUGE_VAL == HUGE_VAL / 2)
(1 / HUGE_VAL == 0)
(sqrt(HUGE_VAL) == HUGE_VAL)
(sqrt(-1) == HUGE_VAL)
(sqrt(-HUGE_VAL) == HUGE_VAL)

and

sqrt(HUGE_VAL) doesn't set errno, but sqrt(-1) and sqrt(-HUGE_VAL) do.

Does that all seem right?

Your implementation apparently defines HUGE_VAL as a positive infinity,
which is legitimate. All the rest flows pretty obviously from there.

Nov 15 '05 #2
pete wrote:
On my system, the following five expressions are true:

(HUGE_VAL == HUGE_VAL / 2)
(1 / HUGE_VAL == 0)
(sqrt(HUGE_VAL) == HUGE_VAL)
(sqrt(-1) == HUGE_VAL)
(sqrt(-HUGE_VAL) == HUGE_VAL)

and

sqrt(HUGE_VAL) doesn't set errno, but sqrt(-1) and sqrt(-HUGE_VAL) do.

Does that all seem right?


If HUGE_VAL and HUGE_VALF are INFINITY, as they are in my
implementation, that would explain much. Your question has led me to
discover that HUGE_VALL is broken on my implementation (it is an
unnormalized NaN).
Nov 15 '05 #3
Martin Ambuhl wrote:
If HUGE_VAL and HUGE_VALF are INFINITY, as they are in my
implementation, that would explain much. Your question has led me to
discover that HUGE_VALL is broken on my implementation (it is an
unnormalized NaN).


An "unnormalized" NaN? I'm having trouble with
the concept; can you explain in more detail?

--
Eric Sosman
es*****@acm-dot-org.invalid
Nov 15 '05 #4
ro***********@yahoo.com wrote:

pete wrote:
On my system, the following five expressions are true:

(HUGE_VAL == HUGE_VAL / 2)
(1 / HUGE_VAL == 0)
(sqrt(HUGE_VAL) == HUGE_VAL)
(sqrt(-1) == HUGE_VAL)
(sqrt(-HUGE_VAL) == HUGE_VAL)

and

sqrt(HUGE_VAL) doesn't set errno,
but sqrt(-1) and sqrt(-HUGE_VAL) do.

Does that all seem right?


Your implementation apparently
defines HUGE_VAL as a positive infinity,
which is legitimate. All the rest flows pretty obviously from there.


Thank you. I have more questions.
What other options are there besides positive infinity?
Could sqrt(HUGE_VAL) be undefined?
Is it allowed for sqrt(HUGE_VAL) to set errno to errange
if it returns HUGE_VAL?
Are any of the above 5 expressions
guaranteed to be true by the standard,
or is it merely the case that they are allowed to be true?

Suppose I want to write a 100% portable function for C89 and C99
that does exactly what log2 does. Could it be written this way?:

double l_og2(double x)
{
return log(x) / log(2);
}

The point being, Can I really on any funky values like HUGE_VAL,
which might be returned by log(x),
to not be altered by being divided by log(2)?
Or would this be more portable?:

double l_og2(double x)
{
return x > 0 && DBL_MAX >= x ? log(x) / log(2) : log(x);
}
It seems that most settings of errno to ERANGE are optional,
but for exp, it says that you do get them when the magnitude of x
is too large, not x, but the magnitude of x.
Is setting errno to ERANGE optional or mandatory for exp(-DBL_MAX)?
I think it would be a case of underflow.
On a system like mine, where HUGE_VAL is an infinity,
Is setting errno to ERANGE optional or mandatory for exp(-HUGE_VAL)?

--
pete
Nov 15 '05 #5
pete wrote:
errange


I meant ERANGE.

--
pete
Nov 15 '05 #6
pete wrote:
ro***********@yahoo.com wrote:

pete wrote:
On my system, the following five expressions are true:

(HUGE_VAL == HUGE_VAL / 2)
(1 / HUGE_VAL == 0)
(sqrt(HUGE_VAL) == HUGE_VAL)
(sqrt(-1) == HUGE_VAL)
(sqrt(-HUGE_VAL) == HUGE_VAL)

and

sqrt(HUGE_VAL) doesn't set errno,
but sqrt(-1) and sqrt(-HUGE_VAL) do.

Does that all seem right?
Your implementation apparently
defines HUGE_VAL as a positive infinity,
which is legitimate. All the rest flows pretty obviously from there.


Thank you. I have more questions.
What other options are there besides positive infinity?


HUGE_VAL is required to expand into a positive double constant
expression (7.12p3). However, the C standard places no other
requirements on it, unless __STDC_IEC_559__ is #defined by the
implementation, in which case it's required to expand into an
expression with a value of positive infinity (F.9p2). As far as I can
see, if __STDC_IEC_559__ is not #defined, then it would be perfectly
legal to #define HUGE_VAL as DBL_MIN.
Could sqrt(HUGE_VAL) be undefined?
HUGE_VAL must be positive, and there's no positive number for which
sqrt() is undefined.
Is it allowed for sqrt(HUGE_VAL) to set errno to errange
if it returns HUGE_VAL?
According to 7.5p3, "The value of errno may be set to nonzero by a
library function call whether or not there is an error, provided the
use of errno is not documented in the description of the function in
this International Standard."

I could find no mention of errno in 7.12.7.5, which describes sqrt(),
so errno can be set to anything it wants. I'm not sure if that's the
intent; other parts of 7.12 describe the setting of errno in contexts
that apply to sqrt() - but that's not "in the description of the
function".

In particular, errno must be set to ERANGE if sqrt(HUGE_VAL) overflows
and math_errhandling & MATH_ERRNO is true. sqrt(HUGE_VAL) will
overflow, if and only HUGE_VAL is positive infinity.
Are any of the above 5 expressions
guaranteed to be true by the standard,
or is it merely the case that they are allowed to be true?
None of them are required by the standard unless __STDC_IEC_559__ is
#defined, in which case they are required in order to conform with IEC
559.
Suppose I want to write a 100% portable function for C89 and C99
that does exactly what log2 does. Could it be written this way?:

double l_og2(double x)
{
return log(x) / log(2);
}

The point being, Can I really on any funky values like HUGE_VAL,
which might be returned by log(x),
to not be altered by being divided by log(2)?
No.
Or would this be more portable?:

double l_og2(double x)
{
return x > 0 && DBL_MAX >= x ? log(x) / log(2) : log(x);
}
That looks good to me; but I might have missed some tricky detail.
It seems that most settings of errno to ERANGE are optional,
As, for instance, whenever 7.12p3 applies.
but for exp, it says that you do get them when the magnitude of x
is too large, not x, but the magnitude of x.
Is setting errno to ERANGE optional or mandatory for exp(-DBL_MAX)?
I think it would be a case of underflow.
On a system like mine, where HUGE_VAL is an infinity,
Is setting errno to ERANGE optional or mandatory for exp(-HUGE_VAL)?


If math_errhandling & MATH_ERRNO is true, then setting ERANGE is
mandatory for overflows and for cases where the exact value of a
function is infinite (7.12.1p4).

Nov 15 '05 #7
pete wrote:

On my system, the following five expressions are true:

(HUGE_VAL == HUGE_VAL / 2)
(1 / HUGE_VAL == 0)
(sqrt(HUGE_VAL) == HUGE_VAL)
Those are true if HUGE_VAL is +infinity (which it will be if IEEE-754
floating-point is being used).
(sqrt(-1) == HUGE_VAL)
(sqrt(-HUGE_VAL) == HUGE_VAL)
Those should be false. sqrt(negative) should be a NaN (Not-a-Number)
if IEEE-754 style floating-point is supported. And a NaN does not
compare equal to anything. In the general case, a domain error can
return any value, so +infinity is allowed.
and

sqrt(HUGE_VAL) doesn't set errno, but sqrt(-1) and sqrt(-HUGE_VAL) do.


Those are correct.
---
Fred J. Tydeman Tydeman Consulting
ty*****@tybor.com Testing, numerics, programming
+1 (775) 358-9748 Vice-chair of J11 (ANSI "C")
Sample C99+FPCE tests: http://www.tybor.com
Savers sleep well, investors eat well, spenders work forever.
Nov 15 '05 #8
ku****@wizard.net wrote:
pete wrote: As far as I can
see, if __STDC_IEC_559__ is not #defined, then it would be perfectly
legal to #define HUGE_VAL as DBL_MIN.


Thank you.
Hmm...
Suppose I want to write a 100% portable function for C89 and C99
that does exactly what log2 does.

double l_og2(double x)

I'm also attempting e_xp, to do what exp does,
under the same rules as l_og2, for academic purposes.
I've replaced some alogorithms with library function calls
to simplify the appearence of the code.
My exp algorithm only works on nonnegative input.

I had written it this way:

double e_xp(double x)
{
unsigned negative;
double e;

if (0 > x) {
x = -x;
negative = 1;
} else {
negative = 0;
}
if (log(DBL_MAX) >= x) {
exp(x);
} else {
errno = ERANGE;
e = HUGE_VAL;
}
return negative ? 1 / e : e;
}

But if HUGE_VAL can be small,
then I think this way might be more better:

double e_xp(double x)
{
unsigned negative;
double e;

if (0 > x) {
x = -x;
negative = 1;
} else {
negative = 0;
}
if (log(DBL_MAX) >= x) {
exp(x);
if (negative) {
e = 1 / e;
}
} else {
errno = ERANGE;
e = negative ? 0.0 : HUGE_VAL;
}
return e;
}

Because I wouldn't want e_xp to return a large positive number
for large negative x.

Followup set to c.l.c

--
pete
Nov 15 '05 #9
ro***********@yahoo.com wrote:

pete wrote:
On my system, the following five expressions are true:

(HUGE_VAL == HUGE_VAL / 2)
(1 / HUGE_VAL == 0)
(sqrt(HUGE_VAL) == HUGE_VAL)
(sqrt(-1) == HUGE_VAL)
(sqrt(-HUGE_VAL) == HUGE_VAL)

and

sqrt(HUGE_VAL) doesn't set errno,
but sqrt(-1) and sqrt(-HUGE_VAL) do.

Does that all seem right?


Your implementation apparently
defines HUGE_VAL as a positive infinity,
which is legitimate. All the rest flows pretty obviously from there.


Thank you.

--
pete
Nov 15 '05 #10
Fred J. Tydeman wrote:

pete wrote:

On my system, the following five expressions are true:

(HUGE_VAL == HUGE_VAL / 2)
(1 / HUGE_VAL == 0)
(sqrt(HUGE_VAL) == HUGE_VAL)


Those are true if HUGE_VAL is +infinity (which it will be if IEEE-754
floating-point is being used).
(sqrt(-1) == HUGE_VAL)
(sqrt(-HUGE_VAL) == HUGE_VAL)


Those should be false. sqrt(negative) should be a NaN (Not-a-Number)
if IEEE-754 style floating-point is supported. And a NaN does not
compare equal to anything. In the general case, a domain error can
return any value, so +infinity is allowed.
and

sqrt(HUGE_VAL) doesn't set errno,
but sqrt(-1) and sqrt(-HUGE_VAL) do.


Those are correct.


Thank you.

For academic purposes,
I was hoping to be able to write a source code for a function sq_rt,
that would do exactly sqrt was supposed to do,
and have it be portable for C89 and C99.
Some standard functions like are easy to write like that,
like isdigit:

int is_digit(int c)
{
return c >= '0' && '9' >= c;
}

But, the math functions seem more complicated to write
portably because of the various macros in C99 which may
or may not be defined.

This is what I have so far:

double sq_rt(double x)
{
if (DBL_MAX >= x) {
if (x > 0) {
x = sqrt(x);
/*
** I've replaced my sqrt algortihm with the call to sqrt
** to simplify the appearence of the code
*/
} else {
if (0 > x) {
errno = EDOM;

#ifdef __STDC_IEC_559__
x = NAN;
#else
x = HUGE_VAL;
#endif

}
}
} else {
errno = ERANGE;
}
return x;
}

Does that seem about right?
Is this complicated enough enough
that I should try to acquire the standard for IEEE-754
if I want to do it right?
Followup set to c.l.c

--
pete
Nov 15 '05 #11
In article <3s********************@comcast.com>,
Eric Sosman <es*****@acm-dot-org.invalid> wrote:


Martin Ambuhl wrote:
If HUGE_VAL and HUGE_VALF are INFINITY, as they are in my
implementation, that would explain much. Your question has led me to
discover that HUGE_VALL is broken on my implementation (it is an
unnormalized NaN).


An "unnormalized" NaN? I'm having trouble with
the concept; can you explain in more detail?

--
Eric Sosman
es*****@acm-dot-org.invalid


I'm curious also.

If my memory of IEEE-854 isn't too hazy, I think the NaN-ness
of a number is expresed by a special value of the exponent.

Martin may be referring to a situation where a HUGE_VALL
is not a NaN (NaNaN? Oy...) but is expressed with a mantissa >1.0
and an exponent such that upon normalization the exponent would
seemingly be incremented to the special exponent that NaN's have.
(Or possibly mantissa < 0.5 and exponent decremented to it).

But perhaps I am talking out of my hat.
Nov 15 '05 #12
In article <6Ze0f.26$i%.22@fed1read07> an******@example.com writes:
In article <3s********************@comcast.com>,
Eric Sosman <es*****@acm-dot-org.invalid> wrote: ....
Martin Ambuhl wrote:
If HUGE_VAL and HUGE_VALF are INFINITY, as they are in my
implementation, that would explain much. Your question has led me to
discover that HUGE_VALL is broken on my implementation (it is an
unnormalized NaN).


An "unnormalized" NaN? I'm having trouble with
the concept; can you explain in more detail?


It makes no sense. A NaN is signalled by a specific exponent pattern.
The bits in the mantissa can be used for any purpose except the most
leading bit. If it is 0 the NaN is a signalling NaN, if it is 1 it is
a non-signalling NaN. (And if all bits are 0, it is an infinity.)
Martin may be referring to a situation where a HUGE_VALL
is not a NaN (NaNaN? Oy...) but is expressed with a mantissa >1.0
and an exponent such that upon normalization the exponent would
seemingly be incremented to the special exponent that NaN's have.
(Or possibly mantissa < 0.5 and exponent decremented to it).


Impossible. The only numbers in IEEE format that are not normalised
are the denormals, and they are, eh, small. Forcing normalisation on
them forces them to 0.0.
--
dik t. winter, cwi, kruislaan 413, 1098 sj amsterdam, nederland, +31205924131
home: bovenover 215, 1025 jn amsterdam, nederland; http://www.cwi.nl/~dik/
Nov 15 '05 #13
In article <In********@cwi.nl>, Dik T. Winter <Di********@cwi.nl> wrote:


In article <6Ze0f.26$i%.22@fed1read07> an******@example.com writes:
> In article <3s********************@comcast.com>,
> Eric Sosman <es*****@acm-dot-org.invalid> wrote:

...
> > Martin Ambuhl wrote:
> > > If HUGE_VAL and HUGE_VALF are INFINITY, as they are in my
> > > implementation, that would explain much. Your question has led me to
> > > discover that HUGE_VALL is broken on my implementation (it is an
> > > unnormalized NaN).
> >
> > An "unnormalized" NaN? I'm having trouble with
> > the concept; can you explain in more detail?


It makes no sense. A NaN is signalled by a specific exponent pattern.
The bits in the mantissa can be used for any purpose except the most
leading bit. If it is 0 the NaN is a signalling NaN, if it is 1 it is
a non-signalling NaN. (And if all bits are 0, it is an infinity.)
> Martin may be referring to a situation where a HUGE_VALL
> is not a NaN (NaNaN? Oy...) but is expressed with a mantissa >1.0
> and an exponent such that upon normalization the exponent would
> seemingly be incremented to the special exponent that NaN's have.
> (Or possibly mantissa < 0.5 and exponent decremented to it).


Impossible. The only numbers in IEEE format that are not normalised
are the denormals, and they are, eh, small. Forcing normalisation on
them forces them to 0.0.

I interpreted his comment to mean that the text of the macro was
unnormalized. For example (let's use decimal floats so I don't have to
think too hard) something like 999999E+95. In the process of being
placed into floating point representation, the exponent "rolls over"
(in odometer terms) to the same exponent that represents NaN,
something like 1.0E+101. Impossible when things are not broken,
but Martin removed that restriction.

The final decision about what Martin Ambuhl meant of course
rests with Martin Ambuhl. I am just fitting my aged brain cells
to what he said as best I can.

Perhaps we need to "normalize" Martin...
Nov 15 '05 #14
"Anonymous 7843" <an******@example.com> wrote in message
news:Gxk0f.75$i%.50@fed1read07...
In article <In********@cwi.nl>, Dik T. Winter <Di********@cwi.nl> wrote:


In article <6Ze0f.26$i%.22@fed1read07> an******@example.com writes:
> In article <3s********************@comcast.com>,
> Eric Sosman <es*****@acm-dot-org.invalid> wrote:

...
> > Martin Ambuhl wrote:
> > > If HUGE_VAL and HUGE_VALF are INFINITY, as they are in my
> > > implementation, that would explain much. Your question has led me

to
> > > discover that HUGE_VALL is broken on my implementation (it is an
> > > unnormalized NaN).
> >
> > An "unnormalized" NaN? I'm having trouble with
> > the concept; can you explain in more detail?


It makes no sense. A NaN is signalled by a specific exponent pattern.
The bits in the mantissa can be used for any purpose except the most
leading bit. If it is 0 the NaN is a signalling NaN, if it is 1 it is
a non-signalling NaN. (And if all bits are 0, it is an infinity.)
> Martin may be referring to a situation where a HUGE_VALL
> is not a NaN (NaNaN? Oy...) but is expressed with a mantissa >1.0
> and an exponent such that upon normalization the exponent would
> seemingly be incremented to the special exponent that NaN's have.
> (Or possibly mantissa < 0.5 and exponent decremented to it).


Impossible. The only numbers in IEEE format that are not normalised
are the denormals, and they are, eh, small. Forcing normalisation on
them forces them to 0.0.

I interpreted his comment to mean that the text of the macro was
unnormalized. For example (let's use decimal floats so I don't have to
think too hard) something like 999999E+95. In the process of being
placed into floating point representation, the exponent "rolls over"
(in odometer terms) to the same exponent that represents NaN,
something like 1.0E+101. Impossible when things are not broken,
but Martin removed that restriction.

The final decision about what Martin Ambuhl meant of course
rests with Martin Ambuhl. I am just fitting my aged brain cells
to what he said as best I can.

Perhaps we need to "normalize" Martin...


Intel has used the term 'unnormal' to describe binary floating
point number representations, although not as NaNs.

Intel describes unnormals here, for example:
ftp://download.intel.com/design/pent...als/241430.htm

--
Scott
Nov 15 '05 #15
"Dik T. Winter" wrote:

Impossible. The only numbers in IEEE format that are not normalised
are the denormals, and they are, eh, small. Forcing normalisation on
them forces them to 0.0.


The 80-bit format (double extended) on the Intel x87's has many
unusual formats, including psuedo-NaN, pseudo-infinity, and
unnormals. All are treated as signaling NaN.
---
Fred J. Tydeman Tydeman Consulting
ty*****@tybor.com Testing, numerics, programming
+1 (775) 358-9748 Vice-chair of J11 (ANSI "C")
Sample C99+FPCE tests: http://www.tybor.com
Savers sleep well, investors eat well, spenders work forever.
Nov 15 '05 #16
In article <In********@cwi.nl>, "Dik T. Winter" <Di********@cwi.nl>
wrote:
Impossible. The only numbers in IEEE format that are not normalised
are the denormals, and they are, eh, small. Forcing normalisation on
them forces them to 0.0.


In 80 bit format, there are "unnormalized" numbers. The leading bit of
the mantissa is supposed to be set except for denormalized numbers. Take
the number 1.5 in 80 bit IEEE format, for example. There are two bits
supposed to be set in the mantissa, one for 1.0 and one for 0.5. If you
clear the bit for 1.0 in the representation, you get an "unnormalized"
number. I am not at all sure how the IEEE floating point standard says
such values should be treated.
Nov 15 '05 #17
In article <zt****************@newssvr29.news.prodigy.net> "ScottD" <bu***@aol.com> writes:
....
Intel has used the term 'unnormal' to describe binary floating
point number representations, although not as NaNs.


What Intel calls "unnormals" is normally called "denormals".
--
dik t. winter, cwi, kruislaan 413, 1098 sj amsterdam, nederland, +31205924131
home: bovenover 215, 1025 jn amsterdam, nederland; http://www.cwi.nl/~dik/
Nov 15 '05 #18
Dik T. Winter wrote:
In article <zt****************@newssvr29.news.prodigy.net> "ScottD" <bu***@aol.com> writes:
...
> Intel has used the term 'unnormal' to describe binary floating
> point number representations, although not as NaNs.


What Intel calls "unnormals" is normally called "denormals".

Quote from Google search:

IEEE Arithmetic
(Subnormal numbers were called denormalized numbers in IEEE Standard
754. ...
Nov 15 '05 #19

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

4
by: Richard Tobin | last post by:
In a library I am writing, I want to use an errno-like mechanism for error returns. The error would probably be represented as a struct rather than just an integer. I don't have any...
3
by: Mac | last post by:
Is it legal to declare errno after you've included errno.h? For example: #include<errno.h> .... int main (void) {
4
by: Paul Emmons | last post by:
If I am writing a function that sets errno according to a possible error condition, should it also set errno to 0 if it executes normally, or should it leave errno alone on success?
11
by: Vijay Kumar R Zanvar | last post by:
> In <pan.2004.04.22.04.06.05.969827@bar.net> "Mac" <foo@bar.net> writes: > > >Is it legal to declare errno after you've included errno.h? > > > >For example: > > > >#include<errno.h> > > >...
5
by: Urs Beeli | last post by:
I have a question regarding errno. If I understand it correctly, including <errno.h> allows me to check "errno" for error values that some standard library functions may set. This brings up some...
3
by: eyalc1978 | last post by:
Hi Does someone knows what does errno 72 means I got this error when fwriting a structure and still the file is being created. I saw something on the net saying that this is caused when trying to...
6
by: Satish | last post by:
Hi , What is the behaviour as per ANSI standard for HUGE_VAL * 0.0? Also is there anywhere I can download ANSI standards for C/C++? Thanks, Satish
13
by: Spiros Bousbouras | last post by:
Assume I'm writing a function which is going to set the value of errno if something went wrong but I also want to guarantee that errno will remain unchanged if the function completed its task...
22
by: viza | last post by:
Hi all, A quick one - since errno is a lvalue, can I do: fread( & errno, sizeof errno, 1, fp ) ? TIA viza
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.