powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сравнение чисел double
18 сообщений из 43, страница 2 из 2
Сравнение чисел double
    #37458281
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗапустить религия не позволила? vartype(x) вернет тип LOGICAL т.к. всем переменным объявленным в LOCAL присваивается .F., потому что написанное после AS игнорируется при выполнении.для неинициализированных переменых объявленный тип и впрямь не имеет значения. Пока они не инициализированы. А теперь запишите туда раунд(5,233648б2) и покажите вартайп.
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37458292
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel09, запустил, есть погрешность. Похоже на точность влияет не только кол-во знаков после запятой, но и изначальное общее количество знаков. Как выше писал ROUND() лечит проблему:
Код: plaintext
if ROUND(n1-(n3-n2),  2 )* 10000000000  =  0 . 00  

Не знаю что твои числа означают, но если это деньги или что-то подобное по размерности, то подумай над использованием типа CURRENCY. Его придумали именно для тех случаев где даже малая погрешность недопустима в принципе. Конкретно в твоем примере замени и запусти:
Код: plaintext
n1 = $ 10000 
Реально CURRENCY это 8-мибайтовое целое у которого при отображении запятая сдвигается влево на 4 разряда, т.е. храниться целое количество десятитысячных долей, соответственно все минусы и особенности отсюда:
1. После каждой операции происходит округление до 4 знака, поэтому надо аккуратно делением пользоваться:
Код: plaintext
1.
2.
x = $ 12 . 34 
? x /  1000  *  100  &&  1 . 2300 
? x  *  100  /  1000  &&  1 . 2340 
2. При отображении без форматирования показывается 4 знака после запятой, поэтому приходится постоянно пользоваться форматированием если надо 2 знака после запятой.

Из плюсов: точность вычислений 18 знаков (больше будет ошибка переполнения), операции с CURRENCY выполняются немного быстрее чем с Numeric и Double.

Лично я предпочитаю тип CURRENCY если его допустимо применить. Некоторые разработчики его не любят (в первую очередь из-за особенности деления).
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37458295
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirDima TЗапустить религия не позволила? vartype(x) вернет тип LOGICAL т.к. всем переменным объявленным в LOCAL присваивается .F., потому что написанное после AS игнорируется при выполнении.для неинициализированных переменых объявленный тип и впрямь не имеет значения. Пока они не инициализированы. А теперь запишите туда раунд(5,233648б2) и покажите вартайп.
Ничего не понял. Это к чему сказано?
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37459281
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Ttanglirпропущено...
А теперь запишите туда раунд(5,233648б2) и покажите вартайп.
Ничего не понял. Это к чему сказано?К тому, что пока в переменной по умолчанию .F., то, конечно, вартайп вернёт L, это и ежу понятно. Но что вернёт вартайп, если в переменную заранее объявленного типа всё-таки записать значение, которое можно трактовать либо как объявленный тип, либо как какой-то другой. Вопрос-то в этом был, или я что-то пропустил?
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37459351
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirDima Tпропущено...

Ничего не понял. Это к чему сказано?К тому, что пока в переменной по умолчанию .F., то, конечно, вартайп вернёт L, это и ежу понятно. Но что вернёт вартайп, если в переменную заранее объявленного типа всё-таки записать значение, которое можно трактовать либо как объявленный тип, либо как какой-то другой. Вопрос-то в этом был, или я что-то пропустил?
Пропустил, если вкратце, то была попытка доказать что "local x as doub" создает переменную типа DOUBLE. В хэлпе так написано:
MSDNLOCAL Command
Visual Studio .NET 2003
Creates local variables and variable arrays.

LOCAL Var1 [AS type [OF ClassLib]] ...

VarList
Specifies one or more local variables to create.
[ARRAY] ArrayName1 (nRows1 [, nColumns1]) [, ArrayName2 (nRows2 [, nColumns2])] ...
Specifies one or more local arrays to create. See DIMENSION for a description of each argument.
AS type
Specifies the data type on which this variable or array is based.
....
Оно и правда написано, только далее
MSDNRemarks
...
Variables and arrays created with LOCAL are initialized to false (.F.)...
Как хочешь так и понимай. Вобщем ерунды какой-то понаписали в хэлпе по поводу типизации переменных. Тут еще интересный опус: How to: Implement Strong Typing for Class, Object, and Variable Code
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37459372
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем мое мнение: конструкция "AS ..." в фоксе нужна только чтобы подсказки выскакивали при наборе кода (свойства, методы объектов) и на работу кода она никак не влияет, т.е. при выполнении кода игнорируется.
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37461125
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Dima T
> Вобщем мое мнение: ...

Полностью разделяю это мнение.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37465488
nazinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор> Автор: Dima T
> Вобщем мое мнение: ...

Полностью разделяю это мнение.
Аналогично!
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37466261
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давно не заглядывал на форум.... вот наворочено-то :)

Дима_Т, я не говорил ""local x as doub" создает переменную типа DOUBLE", тут у нас легкое недопонимание, из-за чего полагаю и возник сыр-бор.

local x as doub описывает переменную, которая _после_ придания ей корректного значения будет держать это значение как DOUBLE. Разница в нюансах.

А почему присваивает тип "поэкономней"... гм, потому что таков принцип фокса и не только его.. если по умолчанию присваивать наоборот, самые громоздкие типы - то рано или поздно начнуться проблемы.. например, с памятью.
Пример с такси показался Вам недостаточно наглядным? ;)
Или Вы наверно, везучий и по работе постоянно сталкиваетесь с новым железом и _не_ сталкивались с ситуацией "оперативка не более 256, причем половина ее уже забита всяким хламом"

"Вобщем мое мнение: конструкция "AS ..." в фоксе нужна только чтобы подсказки выскакивали при наборе кода (свойства, методы объектов) и на работу кода она никак не влияет, т.е. при выполнении кода игнорируется."...ээээ
мы на каких-то разных русских языках говорим, судя по всему :)
какие нафиг подсказки если речь идет о _переменных_?
Свойства и методы объектов касаются именно этих самых объектов, а какая подсказка по-Вашему должна вылезать при наборе переменной var1, объявленной как дубле? и в чем эта подсказка должна по-Вашему отличаться от переменной, объявленной AS INTEGER или AS еще много чего... Логика "для подсказок" сработает _только_ если объявляем AS Class...
Во всех остальных случаях AS для подсказок не может быть использован, потому что ПОДСКАЗЫВАТЬ НЕЧЕГО.
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37466322
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SSn888local x as doub описывает переменную, которая _после_ придания ей корректного значения будет держать это значение как DOUBLE. Разница в нюансах.

Чушь полная .
local x as double
абсолютно идентично
local x
и создает логическую переменную, никакую не double. И значение после as double этой переменной можно присвоить ЛЮБОГО ТИПА, хоть двадцать раз as double напишите. Потому что в фоксе динамическая типизация, а as double служит вовсе не для указания типа, как Вы думаете. Вы, похоже, фокс в глаза не видели :)
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37466346
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XAndy,
У Вас в Киеве всегда так принято слету хамить свысока или (надеюсь) - это только Вы такой выдающийся? Мне что - скан трудовой сюда со стажем вфп выложить? Окстись, не спеши судить свысока!

На вопрос "а зачем тогда возможность написать AS double", кстати - внятного ответа так и не получил ("для подсказки" не канает - см. выше)
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37466463
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSn888Давно не заглядывал на форум.... вот наворочено-то :)

Дима_Т, я не говорил ""local x as doub" создает переменную типа DOUBLE", тут у нас легкое недопонимание, из-за чего полагаю и возник сыр-бор.

local x as doub описывает переменную, которая _после_ придания ей корректного значения будет держать это значение как DOUBLE. Разница в нюансах.

XAndy выше упоминал структуру ev_width , это и есть внутреннее хранение переменной в памяти:
MSDN Value Structure Definition// An expression's value.
Typedef struct {
char ev_type;
char ev_padding;
short ev_width;
unsigned ev_length;
long ev_long;
double ev_real;
CCY ev_currency;
MHANDLE ev_handle;
ULONG ev_object;
} Value;

Value Structure Fields

The following table is a guide to the values you can pass and receive in the Value structure for different types of data. Only the structure fields listed for a data type are used for that data type.

Contents of Value structure for different data types
Data typeStructure fieldValueNumericev_type'N'ev_widthDisplay widthev_lengthDecimal placesev_realDouble precision


Нет там нескольких типов для нецелых чисел, только DOUBLE

SSn888А почему присваивает тип "поэкономней"... гм, потому что таков принцип фокса и не только его.. если по умолчанию присваивать наоборот, самые громоздкие типы - то рано или поздно начнуться проблемы.. например, с памятью.
Я уже писал что не память надо экономить. Считаем:
65535 - максимально возможное количество переменных в фоксе (по умолчанию 16384)
8 байт - под хранение DOUBLE
т.е. под 65535 переменных DOUBLE надо 524280 байт, т.е. 0,5 Мб. Чего тут экономить?

SSn888Или Вы наверно, везучий и по работе постоянно сталкиваетесь с новым железом и _не_ сталкивались с ситуацией "оперативка не более 256, причем половина ее уже забита всяким хламом"
угу, есть еще вторые пни с W98 + 16Мб где действительно 6й фокс тормозит, правда стоит до 32Мб памяти добавить и все летает.

SSn888какие нафиг подсказки если речь идет о _переменных_?
Свойства и методы объектов касаются именно этих самых объектов, а какая подсказка по-Вашему должна вылезать при наборе переменной var1, объявленной как дубле? и в чем эта подсказка должна по-Вашему отличаться от переменной, объявленной AS INTEGER или AS еще много чего... Логика "для подсказок" сработает _только_ если объявляем AS Class...
Во всех остальных случаях AS для подсказок не может быть использован, потому что ПОДСКАЗЫВАТЬ НЕЧЕГО.
Немного истории фокса: в VFP6 (появился в 98м) подсказок не было и "AS" не было, после выхода SP5 мелкомягкие решили фокс похоронить, хоронили лет 5-6, потом неожиданно появилась 7-ка, следом в течении года 8-ка, в одной из которых это и появилось. Большая часть изменений были косметические, т.к. VFP6 имел устаревший вид прог под W95.
Т.е. по-твоему в платформе которая была создана под слабые компы в очередной версии добавили оптимизацию переменных? Кстати это совсем немаленькая доработка.

IntelliSence при подсказках пытается найти класс и вывести его свойства и методы, если не находит, то ничего не подсказывает.
Повторяю, то что после AS игнорируется при выполнении, простой пример:
Код: plaintext
1.
local x as supervar
x =  10 
Никаких ошибок не возникает, хотя другие языки дают ошибку в этом случае.

PS Не знаю как еще доказать отсутствие функционала, если ты считаешь что он все-таки есть - покажи пример кода при котором после добавления "AS ..." что-то изменится.
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37466859
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

1) AS не влияет на функционал (твое утверждение, с которым, как вижу, есть достаточное количество согласных)
2) AS касаемо основных типов не служит для подсказки (см. выше)

И все-таки: А для чего тогда введено AS? В смысле - для чего оно введено для типов (с классами-то понятно)? Руководствуясь простой нормальной логикой - "если есть - значит для чего-то надо"...

И, пожалуйста, не надо столь подробных экскурсов в историю. Тут - излишне.
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37467128
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХЗ почему так сделали, могу только свои предположения высказать:
1. Не факт что в хэлпе под data type подразумеваются простые типы, может под data type классы пользователя подразумеваются:
MSDNAS type
Specifies the data type on which this variable or array is based.
OF ClassLib
Specifies the class library containing the type description on which the type element of this variable or array is based.
Для базовых классов фокса можно без OF писать:
Код: plaintext
local x as timer
или где-то вначале подцепить библиотеку со своими классами (SET CLASSLIB TO MyLib), а потом на ее классы ссылаться без OF
Код: plaintext
local x as clsMy
это я к тому что невозможно проверить корректность написанного после AS т.к. SET CLASSLIB может быть не выполнена на момент правки кода.

2. Примечание (подсказка) разработчику какого типа задумана переменная. Хотя для решения этой проблемы с типами многие используют венгерскую нотацию.

Вобщем сделали это для классов и добавили игнорирование любых непонятных слов, как следствие получилось что после AS можно писать все что угодно.
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37467143
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSn888И все-таки: А для чего тогда введено AS? В смысле - для чего оно введено для типов (с классами-то понятно)? Руководствуясь простой нормальной логикой - "если есть - значит для чего-то надо"...
Так Вам уже несколько раз объяснили. Это исключительно "дизайнерская" штука. В смысле, используется для раннего связывания на этапе написания программного кода. Не исполнения!

Ну, например, если написать так

Код: plaintext
LOCAL loExcel as Excel.Application

То потом, в тексте кода, если написать имя переменной loExcel и поставить точку, то отобразится выпадающий список свойств и методов объекта Excel (разумеется, если он был зарегестрирован). Без необходимости предварительного создания экземпляра Excel.

То же самое будет справедливо и для внутренних (пользовательских) классов FoxPro.

Однако, повторюсь, это действует только и исключительно на этапе разработки приложения "Design Time". На этапе исполнения кода (даже не в EXE, а просто для отладки) опция "as" - ничего не значит. Игнорируется.
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37467195
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SSn888это только Вы такой выдающийся?
Всё относительно ))))))))

Не понятно, почему Вам так трудно выполнить в среде разработки две строчки кода?
Код: plaintext
1.
2.
local x as double
? vartype(x)
или при отсутствии таковой поверить людям на слово, что as double НИЧЕГО не значит в runtime? 40 постов ради чего? Явный троллинг
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37467559
SSn888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XAndy,

я вообще-то не претендовал на роль святого :)

Тем не менее - "да, я был не прав в таком-то моменте" вовсе не означает "Да, Дмитрий прав".
Есть какой-то третий вариант.
Уже просто из спортивного интереса пытаюсь его нащупать... "Нахрена оно на самом деле"
Пока мало чего выходит, если найду - обязательно сюда тисну..

А насчет троллингов... Сударь, если Вам мерещаться гоблины или есть желание поругаться - обратитесь к зеркалу. Оно, падла, всегда покажет какой-нить прыщик :);)
Мне же лично просто доставляет удовольствие общение (пусть и не всегда.. ээ.. ровное) с людьми тут :)
...
Рейтинг: 0 / 0
Сравнение чисел double
    #37479345
:):):)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
задайте сами точность при сравнении
if abs(n1-n2)<0.0001
...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сравнение чисел double
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]